R,聚合补充 data.table

R, Complement on aggregating data.table

是否可以在 R data.tables 中与补码聚合。示例如下。

library(data.table)
dt <- data.table(a=c("word1","word2","word2","word2"), b=c("cat1","cat1","cat1","cat2"))

获取类别中特定单词的数量

newdt <- dt[,(.N),by=.(a,b)]
#word1,cat1 - 1
#word2,cat1 - 2
#word2,cat2 - 1

我如何计算类别中所有其他单词的数量?或相关地,该词所属的其他类别的数量?像下面这样的东西?

#doesn't work
#newdt2 <- dt[a!=a,(.N),by=.(a,b)]
#the expected answer would be
#word1,cat1 - 2
#word2,cat1 - 1
#word2,cat2 - 0

我在在线教程或问题中找不到这方面的任何帮助。有没有简单的方法来获得补码。 Data.table 解决方案会很好,因为可以处理 50M 行 table。谢谢!

以下是您的代码(我添加了双引号以便它运行):

library(data.table)
dt <-
 data.table(a=c("word1","word2","word2","word2"),b=c("cat1","cat1","cat1","cat2"))

newdt <- dt[,(.N),by=.(a,b)]
names(newdt) = c("a", "b", "cnt") # rename the count column

下面一行会统计每个类别出现的次数

catCnt = dt[,(.N),by=.(b)]
names(catCnt) = c("b", "tot_b")
catCnt

除当前词外属于每个类别的词数为属于该类别的词数与couple(category,word)出现次数之差. 为了获得结果,我按类别列

合并了两个 data.table 对象
aux = merge(newdt, catCnt, by="b")

然后我计算总计数与 "couple" 计数之间的差异:

aux$cnt_not_a = aux$tot_b - aux$cnt

如果您只想保留必填列:

res = aux[, c("b", "a", "cnt_not_a")]
res

我不知道您是否可以仅使用 data.table 命令来实现这一点,但这对我来说看起来很简单...

按照 的想法计算每个类别的总计数减去每个类别中的单词数的差值,但使用 data.table 语法和 连接更新 这变成了 "one-liner":

library(data.table)
dt <-data.table(a = c("word1", rep("word2", 3L)), b = c(rep("cat1", 3L), "cat2"))
dt[, .N, by = .(a, b)][dt[, .N, by = b], on = "b", Nc := i.N - N][]
       a    b N Nc
1: word1 cat1 1  2
2: word2 cat1 2  1
3: word2 cat2 1  0