【问题标题】:duplicate rows in my counting by group with data.table in R在我的分组计数中使用 R 中的 data.table 重复行
【发布时间】:2015-10-14 04:35:25
【问题描述】:

我真的很抱歉问这个愚蠢的问题,但我不明白出了什么问题。 我有一个数据集,我将其转换为 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 中是否有一个选项可以解决我的问题?

【问题讨论】:

  • 我想知道你的意思是不是counting=base[,list(COUNT= .N), by = group]
  • 非常感谢,我会疯的
  • 很高兴为您提供帮助。 :)
  • @akrun 如果您认为值得这样做,我很乐意这样做。 :)
  • @akrun 任务完成。如果需要任何修改,请告诉我。非常欢迎您编辑我的答案。

标签: r group-by data.table


【解决方案1】:

接受 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 对象中添加一个新列。当您使用:= 时,您所做的相当于dplyr 中的mutate() 或基础R 中的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。我希望这能让你头脑清醒。

【讨论】:

  • 不要做dt1 &lt;- 。新添加的列已经在base 中,分配整个内容没有任何意义。 (我看到它可以帮助您通过调用 dim 来说明发生了什么,但不应该鼓励 OP 这样做。)
  • @Frank 感谢您的评论。我理解你的评论。我打算遵循 OP 所做的事情(即counting=base[,COUNT:= .N, by = group])。此外,我也打算使用 dim() 。请随时编辑我的答案并帮助 OP。再次感谢您的评论。 :)
【解决方案2】:

你注意到了吗?

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

即使 group 和 regroup 相同,也给出 100,000 行?

【讨论】:

    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 2021-01-03
    • 2020-09-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 2017-01-20
    相关资源
    最近更新 更多