【问题标题】:unique working incorrectly with data.table [duplicate]独特的 data.table 工作不正确[重复]
【发布时间】:2015-02-25 13:02:19
【问题描述】:

我在 data.table 中发现了一些有趣的行为,我很好奇是否有人可以向我解释为什么会发生这种情况。我正在合并两个 data.tables(在这个 MWE 中,一个有 1 行,另外 2 行)。合并的 data.table 有两个唯一的行,但是当我在合并的 data.table 上调用 unique() 时,我得到了一个包含一行的 data.table。难道我做错了什么?或者这是一个错误?

这是一个 MWE:

library(data.table)
X = data.table(keyCol = 1)
setkey(X, keyCol)
Y = data.table(keyCol = 1, otherKey = 1:2)
setkeyv(Y, c("keyCol", "otherKey"))
X[Y, ] # 2 unique rows
unique(X[Y, ]) # Only 1 row???

我希望 unique(X[Y, ]) 与 X[Y, ] 相同,因为所有行都是唯一的,但事实并非如此。

【问题讨论】:

  • 检查attr(X[Y], "sorted")。它由keyCol 键入,所以这是unique 使用的。然后尝试Y[X],然后检查attr(Y[X], "sorted"),你会弄明白的。
  • 所以如果两行有不同的值但相同的键,那么其中一个会被data.table:::unique.data.table 删除?
  • 我不确定你的意思,但实际上你应该只用key(X[Y])key(Y[X])检查密钥
  • @DavidArenburg 我还是有点困惑...... Y[X, ] 与这个问题有什么关系?我知道 Y 的键比 X 多,但我不明白为什么 unique(X[Y, ]) 会“重复”具有相同键但具有不同值的两行。
  • 阅读?unique,尤其是by参数。

标签: r unique data.table


【解决方案1】:

by 参数 unique.data.table 的默认值为 key(x)。因此,如果您对键控 data.table 执行unique(x),它只会查看键列。要覆盖它,请执行以下操作:

unique(x, by = NULL)

by = NULL 默认考虑所有列。或者您也可以提供by = names(x)

【讨论】:

猜你喜欢
  • 2018-07-29
  • 2020-04-16
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多