繁体   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