采取以下数据表:
# 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)
我如何用年份和类型来计算具有中位数的NA?我试过以下
# 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
但是当你运行代码时,除非一个组完全缺少数据,否则你会看到它有效,并且计算出的中位数会被回收。有更简单的方法吗?或者你将如何解决最后一个错误?
答案 0 :(得分:5)
如果您希望更新行而不复制整个列,则:
require(data.table) # v1.9.6+
cols = c("Year", "Type")
dt[is.na(Value), Value := dt[.BY, median(Value, na.rm=TRUE), on=cols], by=c(cols)]
.BY
是一个特殊符号,它是一个包含组的命名列表。虽然这需要每次都与整个data.table连接,但它应该非常快,因为它只搜索一个组。
答案 1 :(得分:3)
没有必要制作辅助桌子;它可以在单个分组呼叫中完成:
mydt[,
Value := replace(Value, is.na(Value), median(Value, na.rm=TRUE))
, by=.(Year,Type)]
这种估算并不能保证所有缺失值都被填充(例如,2005-B仍然是NA
)。