如何通过组对data.table中的值进行估算?

时间:2015-10-14 21:42:54

标签: r data.table

采取以下数据表:

# 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

但是当你运行代码时,除非一个组完全缺少数据,否则你会看到它有效,并且计算出的中位数会被回收。有更简单的方法吗?或者你将如何解决最后一个错误?

2 个答案:

答案 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)。