簡體   English   中英

如何按組估算數據表中的值?

[英]How to impute values in a data.table by groups?

取得以下數據表:

# 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)

我應該如何用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

但是當您運行代碼時,您會看到它是有效的,除非一組完全缺少數據,並且計算出的中位數會被回收。 有沒有更簡單的方法? 或如何解決僅解決的最后一個錯誤?

如果您希望更新行而不復制整個列,那么:

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聯接,但是它應該非常快,因為它僅搜索一組。

無需創建輔助表。 可以在單個按組調用中完成:

mydt[, 
  Value := replace(Value, is.na(Value), median(Value, na.rm=TRUE))
, by=.(Year,Type)]

這種推論不能保證所有缺失值都得到填充(例如2005-B仍然是NA )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM