【发布时间】:2011-10-28 18:29:35
【问题描述】:
我有一个 a 和 b 的 data.table,我已将其划分为 below,b above,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 之间进行左外连接:对于above 中的每个a,计算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% 的内存)。
【问题讨论】:
-
你能用人类的语言写下你想要达到的目标吗?
-
您可以先尝试寻找答案。 data.table 是 data.frame 的扩展,具有合并功能。
-
同意你应该用自然语言解释你想要什么,但另外我在版本 1.6 和(更新后)1.6.4 中都得到一个错误:abs(j) 中的错误:非数字参数到数学函数此外:警告消息:在 is.na(j) 中:is.na() 应用于“NULL”类型的非(列表或向量)
-
抱歉,来晚了——希望这个问题现在好很多倍。
标签: sql r data.table