gpt4 book ai didi

r - R中的data.table - 使用多个键的多个过滤器 - 二进制搜索

转载 作者:行者123 更新时间:2023-12-03 20:16:28 25 4
gpt4 key购买 nike

我不明白如何根据 data.table 中的多个键进行过滤.采取内置mtcars数据集。

DT <- data.table(mtcars)
setkey(DT, am, gear, carb)

关注 vignette ,我知道如果我想要过滤对应于 am == 1 & gear == 4 & carb == 4 , 我可以说
> DT[.(1, 4, 4)]
mpg cyl disp hp drat wt qsec vs am gear carb
1: 21 6 160 110 3.9 2.620 16.46 0 1 4 4
2: 21 6 160 110 3.9 2.875 17.02 0 1 4 4

它给出了正确的结果。此外,如果我想拥有 am == 1 & gear == 4 & (carb == 4 | carb == 2) , 这也有效
> DT[.(1, 4, c(4, 2))]
mpg cyl disp hp drat wt qsec vs am gear carb
1: 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
2: 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
3: 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
4: 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2

但是,当我想要 am == 1 & (gear == 3 | gear == 4) & (carb == 4 | carb == 2) , 似是而非的
> DT[.(1, c(3, 4), c(4, 2))]
mpg cyl disp hp drat wt qsec vs am gear carb
1: NA NA NA NA NA NA NA NA 1 3 4
2: 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
3: 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2

失败。您能否向我解释一下这里的正确方法是什么?

最佳答案

您没有从查询中得到错误的原因是 data.table 当它们是其他值的倍数时将重用它们。换句话说,因为 1对于 am可以使用2次,它会在不告诉你的情况下做到这一点。如果您要进行查询,其中允许值的数量不是彼此的倍数,那么它会给您一个警告。例如

DT[.(c(1,0),c(5,4,3),c(8,6,4))]

将给您一个警告,提示剩余 1 个项目,您在键入 data.table(c(1,0),c(5,4,3),c(8,6,4)) 时会看到相同的错误.每当合并 X[Y] , 两个 XY应该被认为是data.tables。

如果您改为使用 CJ ,
DT[CJ(c(1,0),c(5,4,3),c(8,6,4))]

然后它将为您生成所有值的每种组合,并且 data.table 将给出您期望的结果。

从小插图(粗体是我的):

What’s happening here? Read this again. The value provided for the second key column “MIA” has to find the matching vlaues in dest key column on the matching rows provided by the first key column origin. We can not skip the values of key columns before. Therfore we provide all unique values from key column origin. “MIA” is automatically recycled to fit the length of unique(origin) which is 3.



为了完整起见,矢量扫描语法将在不使用 CJ 的情况下工作。
DT[am == 1 & gear == 4 & carb == 4]

或者
DT[am == 1 & (gear == 3 | gear == 4) & (carb == 4 | carb == 2)]

你怎么知道你是否需要二分查找?如果子集的速度难以忍受,那么您需要进行二分搜索。例如,我有一个 48M 行的 data.table 我正在玩,二分搜索和向量之间的差异相对于彼此是惊人的。具体来说,矢量扫描需要 1.490 秒的耗时,但二进制搜索只需要 0.001 秒。当然,这假设我已经键入了 data.table。如果我包括设置 key 所需的时间,那么设置 key 和执行子集的组合是 1.628。所以你必须选择你的毒药

关于r - R中的data.table - 使用多个键的多个过滤器 - 二进制搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31351958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com