基于匹配另一列的行子集用均值替换 NA?

标签 r dataframe

我有数据,其中每一行都包含一个人的性别和体重(以磅为单位):

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/

相关文章:

python - 理论上,对于 Apache Spark,Scala 比 Python 更快。实际上并非如此。这是怎么回事?

r - 如何检查两个数据框是否具有相同的列名?

debugging - 如何从一开始就逐步执行R脚本?

r - 用于静态报告的类似 Valuebox 的函数

python - R拼写检查器/分词器

r - 存储没有日期但不作为类字符的时间

r - 使用阈值识别重复数据

excel - 如何在 Pandas 数据框列中插入逗号作为千位分隔符?

python - 在具有更改值的新数据框中返回的数据框列

r - 如何通过另一个变量对 data.frame 的列进行排序