我有一个数据框,其条目从0到5运行,其中0表示缺少条目。我想用每行的平均值重新删除缺少的条目。应仅根据未缺失的值计算平均值。我该怎么做?
例如,行:
[1] 1 2 4 0 3
将成为:
[1] 1.0 2.0 4.0 2.5 3.0
答案 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