gpt4 book ai didi

r - data.table 中的 i 参数(计算结果为逻辑的表达式)

转载 作者:行者123 更新时间:2023-12-01 11:50:07 25 4
gpt4 key购买 nike

我有以下内容:

test <- data.table(id=1:11, t=c(rep(1:2,5), 3))
test[length(unique(id))>1,list(id, t), by=t]

id t
1: 1 1
2: 2 2
3: 3 1
4: 4 2
5: 5 1
6: 6 2
7: 7 1
8: 8 2
9: 9 1
10: 10 2
11: 11 3

我期望这将 testt 进行分组,评估每组的 j 语句,并返回 i 所在的行 为真(即有超过 1 个唯一 ID)。相反,返回的是:

> test
id t
1: 1 1
2: 2 2
3: 3 1
4: 4 2
5: 5 1
6: 6 2
7: 7 1
8: 8 2
9: 9 1
10: 10 2
11: 11 3

似乎 by 仅适用于 j 而不适用于 i。这里有什么建议吗?

最佳答案

无论对错,i 先运行,然后 j 在所有通过 i 的行上按 by 运行.

一个常见的习语是这样的(类似于 SQL 中的 HAVING):

test[,list(id, u=length(unique(id))), by=t][u>1]

并从结果中排除 u(每个组中唯一 ID 的数量):

test[,list(id, u=length(unique(id))), by=t][u>1][,u:=NULL]

顺便说一句,在 i 中对(小得多的)聚合结果(例如上面一行中的 u>1)进行向量扫描比进行向量扫描更有效在(更大的)原始数据上。

如果 j 在整个数据集上由 by 运行,然后在结果上运行 i (如您所料),那么它会导致效率问题。考虑一下它是否以这种方式工作。然后,首先需要对结果进行分组的过滤器需要拆分为两个 [ 调用:DT[i][,j,by]。然后 i 没有看到 j(在 [.data.table 内)并且不知道它需要哪些列。将它组合成一个 DT[i,j,by] 允许 i 在评估之前检查 j 并且只对 j 的列进行子集化 需要。这在使用一小部分列的查询的大型数据集中产生了很大的差异。


要查看发生了什么,将你的 i 设为 j :

test[,length(unique(id))>1]  
# [1] TRUE

然后回收单个TRUEDT[TRUE] == DT。您始终可以通过像那样将其设为 j 来测试 i

关于r - data.table 中的 i 参数(计算结果为逻辑的表达式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12041003/

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