使用循环函数计算具有特定列的行平均值

时间:2015-11-11 02:20:49

标签: r apply lapply

假设我有以下数据框

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当时不会工作。

1 个答案:

答案 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)))
相关问题