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

jks*_*612 6 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)
Run Code Online (Sandbox Code Playgroud)

我如何用年份和类型来计算具有中位数的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
Run Code Online (Sandbox Code Playgroud)

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

Aru*_*run 7

如果您希望更新行而不复制整个列,则:

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)]
Run Code Online (Sandbox Code Playgroud)

.BY是一个特殊符号,它是一个包含组的命名列表.虽然这需要每次都与整个data.table连接,但它应该非常快,因为它只搜索一个组.


Fra*_*ank 4

无需创建辅助表;它可以在单个按组调用中完成:

mydt[, 
  Value := replace(Value, is.na(Value), median(Value, na.rm=TRUE))
, by=.(Year,Type)]
Run Code Online (Sandbox Code Playgroud)

此插补并不能保证所有缺失值都被填充(例如, 2005-B 仍然NA)。