我试图用所有这些列的平均值替换多列中的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()但仍然没有。我知道它与代码并没有真正取代行的意思,但我不知道如何改变它,所以它确实如此。救命啊!
答案 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在哪些位置放置这些值。