【问题标题】:Unexpected result using unique inside a data.table在 data.table 中使用唯一的意外结果
【发布时间】:2015-04-29 13:37:52
【问题描述】:

给定一个 data.table(版本 1.9.5)

TEST <- data.table(1:20,rep(1:5,each=4, times=1))

如果我运行这个:

TEST[unique(V2)]

我得到这个结果:

   V1 V2
1:  1  1
2:  2  1
3:  3  1
4:  4  1
5:  5  2

这真的是预期的行为还是错误? 还是我没有正确使用它?

我正在阅读“R book”,在一个示例中,他们使用 TEST[unique(Vegetation),] 并说它旨在选择植被唯一的行子集。

我希望得到类似的东西

   V1  V2
1:  1   1
2:  5   2
3:  9   3
4:  13  4
5:  16  5

虽然我知道这需要指定聚合条件。

【问题讨论】:

  • 你能解释一下为什么你对这个结果感到惊讶吗? unique(V2) 给出 c(1, 2, 3, 4, 5) 并且因为你在 i 中有这个,所以你得到了前 5 行。你可能想要它在 j 中,即TEST[,unique(V2)]
  • 我就主要问题回复你
  • 你似乎误解了unique 的作用。
  • 使用类似语法的有点复杂的方式:setkey(TEST,V2); TEST[J(unique(V2)),mult="first"]
  • 仅供参考,R 书不包括 data.tables。

标签: r unique data.table


【解决方案1】:

TEST[,unique(V2)] 给出[1] 1 2 3 4 5。因为 TEST[1:5] 应该给你前 5 行,这就是你得到的,所以没有错误。

要获得预期的结果,您可以这样做:

TEST[!duplicated(V2)]
#   V1 V2
#1:  1  1
#2:  5  2
#3:  9  3
#4: 13  4
#5: 17  5

或者这个:

TEST[, V1[1], by = V2]
#   V2 V1
#1:  1  1
#2:  2  5
#3:  3  9
#4:  4 13
#5:  5 17

或者正如@Arun 提醒我的那样,unique 现在有一个 data.table 方法:

unique(TEST, by="V2")
#   V1 V2
#1:  1  1
#2:  5  2
#3:  9  3
#4: 13  4
#5: 17  5

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 2021-12-20
    • 1970-01-01
    • 2012-09-27
    • 2019-01-09
    • 2022-10-14
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多