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
是否可以在 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