2015-10-14 15 views
3

我真的很抱歉問這個愚蠢的問題,但我沒有得到什麼問題。 我有一個數據集,我轉換成data.table對象:重複行在我的計數組與data.table在R

#generate 100,000 ids associated to a group in a data-set called base 
id=c(1:100000) 
group=sample(c(1:5),100000,TRUE) 
base=cbind(id,group) 
base=as.data.table(base) 

我做的計算鹼性基團度日組的行數,結果表仍然包含相同的行數

counting=base[,COUNT:= .N, by = group] 
nrow(counting) 
#100000 

我錯過了什麼? data.table中是否有選項來解決我的問題?

+3

我想知道你是否指'count = base [,list(COUNT = .N),by = group]'。 – jazzurro

+0

非常感謝,我一直在瘋狂 –

+0

高興地幫助你。 :) – jazzurro

回答

6

考慮到akrun的評論,我決定提供一個答案。看起來你不知道如何總結你的數據,並感到困惑。首先,有一點關於構建數據集:

set.seed(123) 
id = c(1:100000) 
group = sample(c(1:5),100000,TRUE) 
base = data.frame(id,group) 
setDT(base) 

base 

     id group 
1:  1  2 
2:  2  4 
3:  3  3 
4:  4  5 
5:  5  5 
.... 

當您使用多種載體cbind(),他們被強制爲同一類,使一個矩陣。更安全的方法是使用data.frame(),它允許混合列類。而且,如果你有一個data.frame,你可以通過參考setDT把它變成一個data.table,而不需要分配結果。

添加一個新列。你的代碼基本上是在data.table對象中添加一個新列。當您使用:=時,您在基準R中執行dplyrtransform()中的mutate()的等效操作,但有一個重要區別。通過:=,該列通過引用添加到data.table中,因此不需要分配結果。

base[, COUNT := .N, by = group] 

base 

    id group COUNT 
1: 1  2 20099 
2: 2  4 19934 
3: 3  3 20001 
4: 4  5 19933 
5: 5  5 19933 
... 

在這裏,你指望有多少數據,每個組存在點,你是對全部行分配值。例如,第2組的總數是20099.您將此編號分配給所有具有group == 2的行。您正在創建一個新列,而不是彙總數據。因此,你仍然有100000行。 base中的行數與以往相同。目前沒有功能可以通過引用修改行數。

總結數據。如果您想要統計每個組中存在多少個數據點並彙總數據,則需要以下內容。

dt2 <- base[, .(COUNT = .N), by = group] 

dt2 

    group COUNT 
1:  2 20099 
2:  4 19934 
3:  3 20001 
4:  5 19933 
5:  1 20033 

dim(dt2) 

[1] 5 2 

在這裏,你要確保你使用=,不:=因爲你總結的數據。有必要分配結果,因爲我們正在創建一個新的data.table。我希望這清理你的想法。

+0

不要做'dt1 < - '。新添加的列已經在'base'中,並且分配整個東西沒有任何用處。 (我發現它可以幫助你通過調用'dim'來說明發生了什麼,但是OP不應該被鼓勵去做。) – Frank

+1

@Frank感謝您的評論。我理解你的評論。我有意遵循OP所做的事情(即'count = base [,COUNT:= .N,by = group]')。另外,我也有使用dim()的意圖。請隨時編輯我的答案,並幫助OP。再次感謝您的評論。 :) – jazzurro

+1

@Frank謝謝你的編輯。 :) – jazzurro

0

你注意到了嗎?

base$regroup = group 
base[, .(Count = .N, regroup), by = group] 

給出100,000行,即使組和重組是相同的?