请看下面的数据表:
# IMPUTING VALUES
library(data.table)
set.seed(1337)
mydt <- data.table(Year = rep(2000:2005, each = 10),
Type = c("A","B"),
Value = 30 + rnorm(60)
)
naRows <- sample(nrow(mydt),15)
mydt[ naRows, Value := NA]
setkey(mydt,Year,Type)
我该如何按年份和类型用中位数填充缺失值?我尝试了以下方法:
# computed medians
computedMedians <- mydt[, .(Median = median(Value, na.rm = TRUE)), keyby = .(Year,Type)]
# dataset of just NA rows
dtNAs <- mydt[ is.na(Value), .SD, by = .(Year,Type)]
mydt[ is.na(Value),
Imputations := dtNAs[computedMedians, nomatch = 0][, Median],
by = .(Year,Type)]
mydt
但是当你运行这段代码时,你会发现它的工作原理只要有数据缺失就会出现问题,并且计算出来的中位数会被循环使用。有没有更简单的方法?或者你如何解决这个错误呢?
mydt[ , Value := replace(Value, is.na(Value), median(Value, na.rm=TRUE)) , by=.(Year,Type)]
注意,对于没有非缺失值的年份-类型组合(例如2005-B),您仍然有缺失值。 - FrankNA
的中位数是NA
。除非你指定备用方法,否则这里没有适当的答案。一种可能性是将整个数据集的中位数作为缺失中位数。是否适用取决于您对数据的假设以及是否存在这样的层次结构。 - alexwhitworth