han*_*ick 3 group-by r data.table
我很遗憾地问这个愚蠢的问题,但我不知道出了什么问题.我有一个数据集,我将其转换为data.table对象:
#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)
Run Code Online (Sandbox Code Playgroud)
我通过计算创建一个基本组,以按组获取行数,结果表仍包含相同的行数
counting=base[,COUNT:= .N, by = group]
nrow(counting)
#100000
Run Code Online (Sandbox Code Playgroud)
我错过了什么?data.table中有一个选项可以解决我的问题吗?
以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
....
Run Code Online (Sandbox Code Playgroud)
当您cbind()在多个向量上使用时,它们会被强制转换为同一个类来生成矩阵.更安全的方法是使用data.frame(),它允许混合列类.并且,如果您有data.frame,则可以通过引用将其转换为data.table setDT,而无需分配结果.
添加新列.您的代码基本上是在data.table对象中添加一个新列.当你使用时:=,你所做的相当于mutate()in dplyr或transform()in R,有一个重要的区别.使用时:=,该列将通过引用添加到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
...
Run Code Online (Sandbox Code Playgroud)
在这里,您计算每个组存在多少个数据点,并将值分配给所有行.例如,第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
Run Code Online (Sandbox Code Playgroud)
在这里,您要确保使用=,而不是:=因为您要汇总数据.有必要分配结果,因为我们正在创建一个新的data.table.我希望这能清除你的想法.