У меня есть таблица данных a и b, которую я разделил на below с помощью b <.5 и 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: для каждого 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% моей памяти).
