按组获取唯一值的行

8

我有一个数据表,想要挑选出其中某个变量x的值相对于另一个变量y是唯一的行。

可以通过以下方式在另一个数据集中获取按y分组的唯一x值:

dt[,unique(x),by=y]

但是我希望挑选原数据集中满足此条件的行。我不想创建一个新的data.table,因为我还需要其他变量。
那么,我在代码中需要添加什么来获取符合上述条件的 dt 行?
dt <- data.table(y=rep(letters[1:2],each=3),x=c(1,2,2,3,2,1),z=1:6) 

   y x z
1: a 1 1
2: a 2 2
3: a 2 3
4: b 3 4
5: b 2 5
6: b 1 6

我想要的:

   y x z
1: a 1 1
2: a 2 2
3: b 3 4
4: b 2 5
5: b 1 6
4个回答

10

惯用的 data.table 方法是:

require(data.table)
unique(dt, by = c("y", "x"))
#    y x z
# 1: a 1 1
# 2: a 2 2
# 3: b 3 4
# 4: b 2 5
# 5: b 1 6

6

data.table 在使用 duplicated 函数时略有不同。以下是我在这里看到的一种方法:

dt <- data.table(y=rep(letters[1:2],each=3),x=c(1,2,2,3,2,1),z=1:6) 
setkey(dt, "y", "x")
key(dt)
# [1] "y" "x"
!duplicated(dt)
# [1]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
dt[!duplicated(dt)]
#    y x z
# 1: a 1 1
# 2: a 2 2
# 3: b 1 6
# 4: b 2 5
# 5: b 3 4

1
顺便说一句,Steve已经在data.table中的duplicatedunique函数中添加了by参数,所以在下一个版本中,您可以指定要测试哪些列:unique(dt,by=c("y","x"))。在R-Forge上的v1.8.9中。默认情况下,bykey(dt),因此如果未提供by,它将像以前一样工作。 - Matt Dowle
但是在设置了键之后,identical(unique(dt),dt[!duplicated(dt)]) 是正确的,那为什么不使用 unique 呢? - Frank

2
更简单的 data.table 解决方案是获取每个组的第一个元素。
> dt[, head(.SD, 1), by=.(y, x)]
   y x z
1: a 1 1
2: a 2 2
3: b 3 4
4: b 2 5
5: b 1 6

0

感谢dplyR

library(dplyr)
col1 = c(1,1,3,3,5,6,7,8,9)
col2 = c("cust1", 'cust1', 'cust3', 'cust4', 'cust5', 'cust5', 'cust5',     'cust5', 'cust6')
df1 = data.frame(col1, col2)
df1

distinct(select(df1, col1, col2))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接