在我的计数中重复行,在R中使用data.table

时间:2015-10-14 04:35:25

标签: r group-by 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)

我通过计算创建一个基本组以按组获取行数,结果表仍然包含相同的行数

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

我错过了什么? data.table中有一个选项可以解决我的问题吗?

2 个答案:

答案 0 :(得分:7)

采取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中的mutate()dplyr中执行的操作相当于transform(),但有一个重要区别。使用:=时,该列将通过引用添加到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。我希望这能让你大开眼界。

答案 1 :(得分:0)

你注意到了吗?

base$regroup = group
base[, .(Count = .N, regroup), by = group]
即使group和regroup相同,

也会产生100,000行?