我有一个 a 和 b 的数据表,我已将其分区为 b below 和 b > .5 的 above:DT = data.table(a=as.integer(c(1,1,2,2,3,3)), b=c(0,0,0,1,1,1))above = DT[DT$b > .5]below = DT[DT$b < .5, list(a=a)]我想在 above 和 below 之间进行左外连接:对于 a 中的每个 above ,计算 below 中的行数。这相当于 SQL 中的以下内容:with dt as (select 1 as a, 0 as b union select 1, 0 union select 2, 0 union select 2, 1 union select 3, 1 union select 3, 1), above as (select a, b from dt where b > .5), below as (select a, b from dt where b < .5)select above.a, count(below.a) from above left outer join below on (above.a = below.a) group by above.a; a | count---+------- 3 | 0 2 | 1(2 rows)我如何用 data.tables 完成同样的事情?这是我到目前为止尝试过的:> key(below) = 'a'> below[above, list(count=length(b))] a count[1,] 2 1[2,] 3 1[3,] 3 1> below[above, list(count=length(b)), by=a]Error in eval(expr, envir, enclos) : object 'b' not found> below[, list(count=length(a)), by=a][above] a count b[1,] 2 1 1[2,] 3 NA 1[3,] 3 NA 1我还应该更具体一点,因为我已经尝试过 merge 但这会破坏我系统上的内存(并且数据集只占用了我大约 20% 的内存)。 最佳答案 看看这是否给你一些有用的东西。您的示例太稀疏,无法让我知道您想要什么,但它似乎是 above$a 值的列表,这些值也在 below$a 中table(above$a[above$a %in% below$a])如果您还想要相反的 ... 值不在 below 中,那么可以这样做:table(above$a[!above$a %in% below$a])你可以连接它们:> c(table(above$a[above$a %in% below$a]),table(above$a[!above$a %in% below$a]) )2 31 2通常 table 和 %in% 的运行占用空间相当小,而且速度很快。关于sql - 如何在 R 中对 data.table 进行基本的左外连接?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7090621/
10-11 15:38