[英]R - Data.table fast binary search based subset with multiple values in second key
我的數據如下所示:
ID TYPE MEASURE_1 MEASURE_2
1 A 3 3
1 B 4 4
1 C 5 5
1 Mean 4 4
2 A 10 1
2 B 20 2
2 C 30 3
2 Mean 20 2
當我這樣做時......一切都按預期工作。
setkey(dt, ID, TYPE)
dt[.(unique(ID), "A")] # extract SD of all IDs with Type A
dt[.(unique(ID), "B")] # extract SD of all IDs with Type B
dt[.(unique(ID), "C")] # extract SD of all IDs with Type C
每當我嘗試這樣的事情時,我想將鍵控子集基於第二個鍵的多個值,我只得到鍵 1 中唯一值的所有組合的結果,只有向量c()
中定義的第一個值為第二把鑰匙。 因此,它只采用向量中定義的第一個值並忽略所有后續值。
# extract SD of all IDs with one of the 3 types A/B/C
dt[.(unique(ID), c("A", "B", "C")]
# previous output is equivalent to
dt[.(unique(ID), "A")] # extract SD of all IDs with Type A
# I want/expect
dt[TYPE %in% c("A", "B", "C")]
我在這里錯過了什么,或者這是我不能用鍵控子集做的事情?
澄清一下:由於我不能在鍵控子集中遺漏鍵 1,因此小插圖要求包含具有unique(key1)
並且在鍵 1 中定義多個鍵也可以按預期工作。
dt[.(c(1, 2), "A")] == dt[ID %in% c(1,2) & TYPE == "A"] # TRUE
在 data.table 文檔中(參見help("data.table")
或https://rdatatable.gitlab.io/data.table/,#arment. )
輸入到 i 的字符、列表和數據幀在內部使用 as.data.table 轉換為 data.table。
因此,在 R (或data.frame
)中使用的經典回收規則適用。 即.(unique(ID), c("A", "B", "C"))
,相當於list(unique(ID), c("A", "B", "C"))
,變為:
as.data.table(list(unique(ID), c("A", "B", "C")))
並且由於最長列表元素的長度( c("A", "B", "C")
的長度)不是較短的( unique(ID)
的長度)的倍數,因此您將收到錯誤消息。 如果您希望unique(ID)
中的每個值與c("A", "B", "C")
中的每個元素相結合,則應使用CJ(unique(ID), c("A", "B", "C"))
代替。
所以你應該做的是dt[CJ(unique(ID), c("A", "B", "C"))]
。
請注意, dt[.(unique(ID), "A")]
可以正常工作,因為您只為第二個鍵傳遞了一個元素,並且這會被回收以匹配unique(ID)
的長度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.