我正在尝试使用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))
谢谢!
答案 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)