我有一个数据框,其条目从 0 到 5,其中 0 表示缺少条目。我想用每行的平均值替换缺失的条目。平均值应仅根据非缺失值计算。我怎么做?
例如,行:
[1] 1 2 4 0 3
会变成:
[1] 1.0 2.0 4.0 2.5 3.0
我有一个数据框,其条目从 0 到 5,其中 0 表示缺少条目。我想用每行的平均值替换缺失的条目。平均值应仅根据非缺失值计算。我怎么做?
例如,行:
[1] 1 2 4 0 3
会变成:
[1] 1.0 2.0 4.0 2.5 3.0
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
对于上面的示例,这应该可以解决问题:
vec[vec == 0] = mean(vec[vec != 0])
您可以将其包装在一个函数中并用于apply
对所有行执行此操作。
虽然可能不像 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