我有其中每行都包含一個人的性別和體重(磅)數據:根據與另一列匹配的行子集,用均值替換NA?
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的意思,但平均值只應使用與具有NA的行相同的gender
值的行進行計算。
具體而言,行4和5具有FEMALE的gender
和NA的weight
。我想用與女性的gender
相匹配的行子集計算的平均值weight
代替NA。在這種情況下,平均值將是從其他行1,2和3的(110 + 120 + 112)/3=114.0。
同樣,我想用行的平均值MALE gender
的權重。
我試過下面的命令,但它取代了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()函數看起來非常強大。 – stackoverflowuser2010