Dplyr根据前一列和行的函数替换值

时间:2017-03-31 11:09:56

标签: 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))

谢谢!

2 个答案:

答案 0 :(得分:3)

我们可以单独提及它们,然后将其除以2,而不是使用mean

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

#  A B
#1 1 2
#2 1 4
#3 2 3

答案 1 :(得分:1)

使用子集的简单基本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)