采取以下数据表:
# 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)
但是当你运行代码时,除非一个组完全缺少数据,否则你会看到它有效,并且计算出的中位数会被回收.有更简单的方法吗?或者你将如何得到最后修正的错误?
如果您希望更新行而不复制整个列,则:
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连接,但它应该非常快,因为它只搜索一个组.
无需创建辅助表;它可以在单个按组调用中完成:
mydt[,
Value := replace(Value, is.na(Value), median(Value, na.rm=TRUE))
, by=.(Year,Type)]
Run Code Online (Sandbox Code Playgroud)
此插补并不能保证所有缺失值都被填充(例如, 2005-B 仍然NA
)。
归档时间: |
|
查看次数: |
1930 次 |
最近记录: |