簡體   English   中英

R - Data.table 基於快速二分搜索的子集,在第二個鍵中有多個值

[英]R - Data.table fast binary search based subset with multiple values in second key

我在https://cran.r-project.org/web/packages/data.table/vignettes/datatable-keys-fast-subset.html#multiple-key-point遇到了這個小插曲。

我的數據如下所示:

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.

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