假设我有以下数据框
a <- data.frame(A = 1:10, B = 26:35, C = 101:110, D = 1001:1010)
a[c(2,4,7),"A"] <- NA
a
A B C D
1 1 26 101 1001
2 NA 27 102 1002
3 3 28 103 1003
4 NA 29 104 1004
5 5 30 105 1005
6 6 31 106 1006
7 NA 32 107 1007
8 8 33 108 1008
9 9 34 109 1009
10 10 35 110 1010
我想知道我们是否可以使用任何循环函数来填充A列中的缺失值,并使用B,C和D列中相应值的平均值,即第2行的NA应替换为377(均值) 27,102和1002)。
我可以使用for循环来实现这一点,但是如果使用apply函数可以做同样的事情,我只是很好奇。
编辑:如果我不想取所有列的意思,但只有少数几个。让我们假设我只需要B和D的意思。我猜rowMeans当时不会工作。
答案 0 :(得分:2)
首先,data.frame不是存储完全数字数据的正确方法:
m = as.matrix(a)
从这里,我们可以在矩阵中找到NA
值的位置
idx = which(is.na(m), arr.ind=TRUE)
row col
[1,] 2 1
[2,] 4 1
[3,] 7 1
并填写
m[idx] <- rowMeans(m[idx[,1], ], na.rm=TRUE)
A B C D
[1,] 1 26 101 1001
[2,] 377 27 102 1002
[3,] 3 28 103 1003
[4,] 379 29 104 1004
[5,] 5 30 105 1005
[6,] 6 31 106 1006
[7,] 382 32 107 1007
[8,] 8 33 108 1008
[9,] 9 34 109 1009
[10,] 10 35 110 1010
这适用于所有列中的NA
,而不仅仅是A
。
如果您的行数比行NA
多,则使用rowMeans(m, na.rm=TRUE)[ idx[,1] ]
的速度会更快。
使用动物园正如@akrun所提到的,这也有效:
library(zoo)
t(na.aggregate(t(m)))