使用行均值替换数据框中的缺失值

时间:2013-05-23 09:24:47

标签: r

我有一个数据框,其条目从0到5运行,其中0表示缺少条目。我想用每行的平均值重新删除缺少的条目。应仅根据未缺失的值计算平均值。我该怎么做?

例如,行:

[1] 1 2 4 0 3

将成为:

[1] 1.0 2.0 4.0 2.5 3.0

3 个答案:

答案 0 :(得分:5)

set.seed(42)
m <- matrix(sample(0:5,15,TRUE),ncol=5)

#      [,1] [,2] [,3] [,4] [,5]
# [1,]    5    4    4    4    5
# [2,]    5    3    0    2    1
# [3,]    1    3    3    4    2

t(apply(m,1,function(x) {x[x==0] <- mean(x[x!=0]); x}))

#      [,1] [,2] [,3] [,4] [,5]
# [1,]    5    4 4.00    4    5
# [2,]    5    3 2.75    2    1
# [3,]    1    3 3.00    4    2

答案 1 :(得分:0)

这应该可以解决上面的例子:

vec[vec == 0] = mean(vec[vec != 0])

您可以将其包装在一个函数中,并使用apply为所有行执行此操作。

答案 2 :(得分:0)

虽然可能不像使用apply那样简化,但对于大型数据集来说这可能更有效

set.seed(7)
m <- matrix(sample(0:5,15,TRUE),ncol=5)
m

#      [,1] [,2] [,3] [,4] [,5]
# [1,]    5    0    2    2    4
# [2,]    2    1    5    1    0
# [3,]    0    4    0    1    2

识别不受欢迎的值并替换为NA

bad <- m==0
m[bad] <- NA

计算忽略NA的行的方法,并用正确的行平均值

替换坏值
m[bad] <- rowMeans(m, na.rm=T)[row(bad)[bad]]
m

#          [,1] [,2]     [,3] [,4] [,5]
# [1,] 5.000000 3.25 2.000000    2 4.00
# [2,] 2.000000 1.00 5.000000    1 2.25
# [3,] 2.333333 4.00 2.333333    1 2.00