1

是否可以与 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 行表。谢谢!

4

2 回答 2

3

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

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

除当前词外,属于每个类别的词数是属于该类别的词数与对(category, word)出现的次数之差。为了获得结果,我data.table按类别列合并了两个对象

aux = merge(newdt, catCnt, by="b")

然后我计算总计数和“夫妇”计数之间的差异:

aux$cnt_not_a = aux$tot_b - aux$cnt

如果您只想保留所需的列:

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

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

于 2017-08-01T12:29:54.120 回答
3

按照Bruno的想法,计算每个类别的总计数减去每个类别中的字数的差值,但使用data.table带有更新的连接的语法,这变成了“单线”:

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
于 2017-08-01T12:46:25.000 回答