使用mutate_at按行均值替换NA

时间:2017-06-01 20:26:11

标签: r dplyr

我试图用所有这些列的平均值替换多列中的NA值。平均值假设按行计算。

我已经尝试过这段代码但是NAs没有被替换:

ID Price1 Price2 Price3 Price4
1  2.1    3      4      NA
2  2      3      4.5    NA
3  2      NA     4      NA
4  NA     3      4      NA

price_cols <- c("Price1", "Price2", "Price3", "Price4")
data %>%
  mutate_at(price_cols, funs(if_else(is.na(.), mean(price_cols, na.rm = TRUE), as.double(.))))

我也试过在管道链上添加rowwise()但仍然没有。我知道它与代码并没有真正取代行的意思,但我不知道如何改变它,所以它确实如此。救命啊!

1 个答案:

答案 0 :(得分:2)

使用arr.ind - which以及is.na(df)rowMeans的参数,您可以在基地R中轻松完成此任务:

i <- which(is.na(df), arr.ind = TRUE)
df[i] <- rowMeans(df[,-1], na.rm = TRUE)[i[,1]]

给出:

> df
  ID Price1 Price2 Price3   Price4
1  1    2.1      3    4.0 3.033333
2  2    2.0      3    4.5 3.166667
3  3    2.0      3    4.0 3.000000
4  4    3.5      3    4.0 3.500000

这是做什么的:

使用which(is.na(df), arr.ind = TRUE),您会得到行号和列号的数组索引,其中有NA - 值:

> which(is.na(df), arr.ind = TRUE)
     row col
[1,]   4   2
[2,]   3   3
[3,]   1   5
[4,]   2   5
[5,]   3   5
[6,]   4   5

使用rowMeans(df[,-1], na.rm = TRUE),您可以获得逐行平均值的向量:

> rowMeans(df[,-1], na.rm = TRUE)
[1] 3.033333 3.166667 3.000000 3.500000

通过使用数组索引的行列对其进行索引,可以获得与数据帧中NA - 值的数量一样长的向量:

> rowMeans(df[,-1], na.rm = TRUE)[i[,1]]
[1] 3.500000 3.000000 3.033333 3.166667 3.000000 3.500000

通过使用array-index索引数据帧df,您可以告诉R在哪些位置放置这些值。