按组用中位数替换NA值

时间:2018-12-01 12:23:05

标签: r na imputation tapply

我使用下面的tapply函数来基于Pclass获得Age的中位数。

现在如何根据Pclass将这些中值估算为NA值?

tapply(titan_train$Age, titan_train$Pclass, median, na.rm=T)

enter image description here

Desired output

2 个答案:

答案 0 :(得分:0)

尝试以下操作。

set.seed(1)
df1 <- data.frame(Pclass = sample(1:3, 20, TRUE),
                  Age = sample(c(NA, 20:40), 20, TRUE, prob = c(10, rep(1, 21))))

new <- ave(df1$Age, df1$Pclass, FUN = function(x) median(x, na.rm = TRUE))
df1$Age[is.na(df1$Age)] <- new[is.na(df1$Age)]

最终清理。

rm(new)

答案 1 :(得分:0)

这是另一种使用base Rreplace的{​​{1}}方法。

ave

想法相同,但使用df1 <- transform(df1, Age = ave(Age, Pclass, FUN = function(x) replace(x, is.na(x), median(x, na.rm = T)))) df1 # Pclass Age # 1 A 1 # 2 A 2 # 3 A 3 # 4 B 4 # 5 B 5 # 6 B 6 # 7 C 7 # 8 C 8 # 9 C 9

data.table

数据

library(data.table)
setDT(df1)
df1[, Age := as.integer(replace(Age, is.na(Age), median(Age, na.rm = T))), by = Pclass]
df1