用行均值替换NA值

10

我想要替换通过某种方式获取的矩阵中的NA值:

read.table(…)

那些数值应该是对应行的平均值。

即,表格中的以下一行:

1 2 1 NA 2 1 1 2

会变成什么

1 2 1 1.43 2 1 2

谢谢。


2
你为什么想要按行这样做?只是确认你没有混淆变量和对象/样本。通常情况下,人们会按列进行操作,计算每个变量的平均值,并使用它来替换变量中的NA - Gavin Simpson
另外,read.table() 返回一个 data.frame。你是在谈论一个数据框还是一个适当的矩阵? - Gavin Simpson
@GavinSimpson,这种情况的原因可能是在测量中使用了重复问题的调查数据。其他问题的平均值将被用来替代缺失的数据。 - Irwin
3个回答

30

这里是一些示例数据。

m <- matrix(1:16, nrow=4)
m[c(1,4,6,11,16)] <- NA

这是我如何使用行均值填充缺失值的方法。

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

你的数据将会处于一个 data.frame 的格式中;你需要先使用 as.matrix 将其转换为矩阵。你可能需要或者不需要保留它的格式;如果要转换回去可以使用 as.data.frame


谢谢。但是使用您的代码后,我收到以下错误消息: Error in [<-.data.frame(*tmp*, k, value = c(3.67857142857143, 3.34375, : 只有逻辑矩阵下标允许替换。 - Delphine
1
首先将您的数据框转换为矩阵(as.matrix),然后进行操作,最后再转换回来(as.data.frame)。 - Aaron left Stack Overflow
1
截至撰写此评论时,该解决方案适用于无需转换的数据框。 - Irwin

5
x[is.na(x)] <- mean(x, na.rm=TRUE)  # for vectors or for a matrix as a whole

t( apply(x, 1, function(xv) { xv[is.na(xv)] <- 
                                    mean(xv, na.rm=TRUE)
                              return(xv)}
          ) ) # for a row-oriented sol'n

3
这会不会返回整个矩阵的平均值? - Brandon Bertelsen
好的,我会这样做。我没有意识到他想要一种行导向的解决方案,但我会加上一个。 - IRTFM

1
a = c(NA, 1, 2, 3, 10)
a[which(is.na(a)==TRUE)] = mean(a,na.rm = T)

3
这个应该可以用,但是过于复杂。is.na(a)返回一个布尔向量,所以== TRUE是多余的。使用“which”也不必要,因为你可以用长度<=“length(a)”的向量或长度为“length(a)”并包含TRUE和FALSE(或0/1被强制转换为TRUE/FALSE)的向量来索引向量。最后,避免使用T和F代替TRUE和FALSE,因为它们可能会被覆盖。 - Ari B. Friedman
我考虑了更多,培训方面 :d - Areza
对于一个矩阵,同样的问题,取所有元素的平均值并替换。 - Brandon Bertelsen
@user702846:不是要打击你的积极性!继续努力吧。 - Ari B. Friedman
令人沮丧的是,看到另一个用户在15分钟后也给出了“相同”的答案,并获得了一些积分!! - Areza
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接