如何在R中使用data.table进行基本的左外连接?
我有一个a和b的data.table,我已经用b <.5和above
分成了below
b> .5:
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])
如果你还希望converse ...值不在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 3
1 2
一般来说, table
和%in%
合理的小脚印中运行并且很快。
由于您似乎在使用package data.table
:check ?merge.data.table
。 我没有使用它,但它似乎可以做你想做的事情:
merge(above, below, by="a", all.x=TRUE, all.y=FALSE)
我认为这很容易:
setkey(above,a)
setkey(below,a)
左外连接:
above[below, .N]
定期加入:
above[below, .N, nomatch=0]
完全外连接与计数:
merge(above,below, all=T)[,.N, by=a]
链接地址: http://www.djcxy.com/p/24907.html
上一篇: How to do a basic left outer join with data.table in R?
下一篇: Efficient alternatives to merge for larger data.frames R