考慮到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中執行dplyr
或transform()
中的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。我希望這清理你的想法。
我想知道你是否指'count = base [,list(COUNT = .N),by = group]'。 – jazzurro
非常感謝,我一直在瘋狂 –
高興地幫助你。 :) – jazzurro