13
有時我需要計算data.table
中一列或另一列中的非NA
元素的數量。什麼是data.table
最好的方式呢?有效計算data.table中的非NA元素
爲具體,讓我們有這方面的工作:
DT <- data.table(id = sample(100, size = 1e6, replace = TRUE),
var = sample(c(1, 0, NA), size = 1e6, replace = TRUE), key = "id")
這使我想到的第一件事情是這樣的:
DT[!is.na(var), N := .N, by = id]
但是,這不幸的缺點是N
沒有得到分配到var
丟失的任何行,即DT[is.na(var), N] = NA
。
所以我解決此通過附加:
DT[!is.na(var), N:= .N, by = id][ , N := max(N, na.rm = TRUE), by = id] #OPTION 1
但是,我不知道這是最好的辦法;由模擬建議this問題爲data.frame
的I想到了另一種選擇,一個是:
DT[ , N := length(var[!is.na(var)]), by = id] # OPTION 2
和
DT[ , N := sum(!is.na(var)), by = id] # OPTION 3
比較這些(平均超過100次試驗)的計算時間,最後似乎成爲最快的:
OPTION 1 | OPTION 2 | OPTION 3
.075 | .065 | .043
有沒有人知道更快的方式data.table
?
@MichaelChirico,看看在[鍵和二進制搜索基於子集(https://github.com/Rdatatable/data.table/wiki/Getting-started)(讓我們知道你是否發現了某些不清楚的東西/要加入[這裏](https://github.com/Rdatatable/data.table/issues/944) – Arun
還有另一種選擇:'dt5 [,。N [!is。 na(var)],by = id]' - 我的系統中第三快,比選項1和2好得多。出於某種原因,選項3產生二進制響應(0,1),而不是計數,如果多於一個'變量被使用,建議的選項5給出正確的計數。 –