2017-08-01 72 views
1

是否可以在R data.tables中进行补充汇总。下面的例子。R,对数据汇总的补充。表

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行表。谢谢!

+1

它不是明确要求 – akrun

+3

是啊,我也有不知道的问题是什么。另外,您的示例不可重现。你有没有试过运行你自己的代码? –

+0

我不明白......不应该把'word2,cat2'变成2吗? – Sotos

回答

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 
+0

呃,那更好! 顺便说一下,感谢格式改进;) –

+0

谢谢!我对数据表有很多了解,但这确实非常简洁,绝对是必要的。非常感谢! – puslet88

+1

@ puslet88为了学习data.table,我推荐https://github.com/Rdatatable/data.table/wiki/Getting-started上的小插曲和FAQ,以及Frank's * Quick R教程的第3章* https:// franknarf1.github.io/r-tutorial/_book/ – Uwe

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)出现的次数之间的差异。 为了更好地实现,结果我按类别列

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

,然后我计算了总数和“情侣”之间的差额合并两个data.table对象计数:

aux$cnt_not_a = aux$tot_b - aux$cnt 

如果你想通过使用data.table命令仅但

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

我不知道,如果你能做到这一点:仅保留所需的列这看起来很简单,我...

+0

非常感谢!一步一步的方法确实是计算事情的方法,我们解决了这个问题,非常感谢!我会将答案打给Uwe更为简洁的答案以供将来参考。 – puslet88

+0

在这种情况下,编辑OP的问题以修复拼写错误通常是安全的,我认为(比如添加这些双引号)。 – Frank