1

我有一个数据框,其条目从 0 到 5,其中 0 表示缺少条目。我想用每行的平均值替换缺失的条目。平均值应仅根据非缺失值计算。我怎么做?

例如,行:

[1] 1 2 4 0 3

会变成:

[1] 1.0 2.0 4.0 2.5 3.0
4

3 回答 3

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
于 2013-05-23T09:35:37.647 回答
0

对于上面的示例,这应该可以解决问题:

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

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

于 2013-05-23T09:34:58.513 回答
0

虽然可能不像 using 那样精简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
于 2014-06-02T17:31:38.403 回答