2017-08-01 119 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