【问题标题】:Why do I get duplicated data.table rows after aggregation?为什么聚合后会出现重复的 data.table 行?
【发布时间】:2015-12-17 12:17:19
【问题描述】:

我按列聚合了一个 data.table,并将其设置为键,然后惊讶地发现该表仍然包含重复的行。 这是什么原因?

我的表格很特别,因为我有两列具有完全相同的值(但出于实际原因必须保留这两列),并且我通过其中一个汇总了表格。

一个简单的例子:

> library(data.table)
> dat = data.table(
+   class1 = c('a', 'a', 'b'), 
+   class2 = c('a', 'a', 'b'), 
+   value = 1:3)
> aggr = dat[, list(class2, sum(value)), keyby = class1]
> stopifnot(!any(duplicated(aggr)))
Error: !any(duplicated(aggr)) is not TRUE

【问题讨论】:

  • 您可能需要dat[, list(unique(class2), sum(value)), keyby = class1] 或使用class1class2 作为分组变量。 dat[, list(sum(value)), .(class1, class2)]
  • 执行dat[, print(.SD), by=class1] 以了解每个组中包含哪些数据。当您在分组中引用变量时,会提取此 data.table 中的列。

标签: r data.table


【解决方案1】:

如果你对所有列使用聚合函数,那么你会得到预期的结果,没有重复的行:

> library(data.table)
> dat = data.table(
+   class1 = c('a', 'a', 'b'), 
+   class2 = c('a', 'a', 'b'), 
+   value = 1:3)
> aggr = dat[, list(class2[[1]], sum(value)), keyby = class1]
> stopifnot(!any(duplicated(aggr)))

请注意,不同之处在于我采用了class2 列的第一个元素。请注意,任何其他输出一个值的函数也可以工作。

【讨论】:

  • 警告没有意义。 by= 不仅仅用于聚合,而且您的示例(有两个相同的列,原因不明)并不能让我相信在实际情况下警告会很有用。
  • @Frank 一个更好的例子而不是两个相同的列是 class1 进一步表征 class2;所以 class2 对于每个 class1 值都是相同的。尽管如此,我的警告请求无效:最初我认为 keyby 是用于聚合 data.table。我只是更彻底地阅读了文档,现在我意识到它比这更笼统。谢谢你解释!我正在删除我的评论,说发生这种情况时应该发出警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
相关资源
最近更新 更多