r - Dplyr替换值基于前一列和前一行的功能



我正在尝试使用 dplyr 将 NA 值替换为上一行和前一列同一行的平均值。请参阅以下示例:

df <- data.frame(A=c(1,1,2), 
B=c(2,4,NA))

因此,在这种情况下,NA 将被替换为 3。我该怎么做?

下面是我正在思考的台词,但它不起作用。

dfb <- df %>%
mutate(B = if_else(is.na(B), mean(lag(B),A), B))

谢谢!

与其使用mean,我们可以单独提及它们,然后将其除以 2。

df %>% mutate(B = ifelse(is.na(B),(lag(B) + A)/2, B))
#  A B
#1 1 2
#2 1 4
#3 2 3

使用子集的简单基本 R 方法是

df$B[is.na(df$B)] <- (df$B[which(is.na(df$B))-1] + df$A[is.na(df$B)]) / 2
df
A B
1 1 2
2 1 4
3 2 3

is.na返回一个逻辑向量,指示每个元素是否为 NA。which返回逻辑 TRUE 元素的位置。 对于平均值的第一个组成部分,which是必要的,因为我们必须找到滞后值。

这可以扩展一点以减少计算(响应docendo-discimus的评论),方法是计算一次缺失值,并存储它,然后重用这个向量。

missers <- is.na(df$B)
df$B[missers] <- (df$B[which(missers)-1] + df$A[missers]) / 2
#clean up, maybe
rm(missers)

相关内容

最新更新