我有数据,其中每一行都包含一个人的性别和体重(以磅为单位):
genders <- c("FEMALE", "FEMALE", "FEMALE", "FEMALE", "FEMALE", "MALE", "MALE", "MALE", "MALE")
weights <- c(110.0, 120.0, 112.0, NA, NA, 190.0, 202.0, 195.0, NA)
df <- data.frame(gender=genders, weight=weights)
df
# gender weight
# 1 FEMALE 110
# 2 FEMALE 120
# 3 FEMALE 112
# 4 FEMALE NA
# 5 FEMALE NA
# 6 MALE 190
# 7 MALE 202
# 8 MALE 195
# 9 MALE NA
对于在
weight
中具有 NA 的每一行列,我想用 weight
替换/估算 NA均值,但应仅使用匹配相同 gender
的行计算均值值作为带有 NA 的行。具体来说,第 4 行和第 5 行有一个
gender
女性和 weight
NA。我想用平均值 weight
替换 NA在匹配 gender
的行子集上计算女性。在这种情况下,其他行 1、2 和 3 的平均值将为 (110+120+112)/3=114.0。同样,我想用 MALE
gender
的权重平均值替换第 9 行中的 NA .我尝试了以下命令,但它用超过 的平均权重替换了 NA全部 跨性别的用户,这不是我想要的。
df$weight[is.na(df$weight)] <- mean(subset(df, gender=df$gender)$weight, na.rm=T)
df
# gender weight
# 1 FEMALE 110.0000
# 2 FEMALE 120.0000
# 3 FEMALE 112.0000
# 4 FEMALE 154.8333
# 5 FEMALE 154.8333
# 6 MALE 190.0000
# 7 MALE 202.0000
# 8 MALE 195.0000
# 9 MALE 154.8333
我搜索了其他问题,但它们与我的问题并不完全相同:
"Replace NA with mean matching the same ID "
"How to replace NA with mean by subset in R (impute with plyr?) "
"How to replace NA values in a table for selected columns? data.frame, data.table "
最佳答案
您可以使用 ave()
与 replace()
(或标准手动更换)。
df$weight <- with(df, ave(weight, gender,
FUN = function(x) replace(x, is.na(x), mean(x, na.rm = TRUE))))
这使
gender weight 1 FEMALE 110.0000 2 FEMALE 120.0000 3 FEMALE 112.0000 4 FEMALE 114.0000 5 FEMALE 114.0000 6 MALE 190.0000 7 MALE 202.0000 8 MALE 195.0000 9 MALE 195.6667
关于基于匹配另一列的行子集用均值替换 NA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38687674/