data.table:删除给定索引值的重复行的子集

时间:2015-10-24 01:21:15

标签: r data.table

我想改进我的代码。我们假设您要删除具有相同标签的重复行'并且' id'。我这样做的方式是:

library(data.table)
dt <- data.table(label = c("A", "A", "B", "B", "C", "A", "A", "A"),
                 id = c(1, 1, 2, 2, 3, 4, 5, 5))
tmp = dt[label == 'A',]
tmp = unique(tmp, by = 'id')
dt = dt[label != 'A',]
dt = rbind(dt, tmp)

是否有更聪明/更短的方法来实现这一目标?如果可能参考? 这段代码看起来非常丑陋,意味着很多副本。

(此外,我必须为一些标签执行此操作,但不是所有标签。所以这意味着每个标签有4行......)

谢谢!

示例:

label id
A     1
A     1
B     2
B     2
C     3
A     4
A     5
A     5

会给:

label id
A     1
B     2
B     2
C     3
A     4
A     5

请注意,由于标签等于&#39; B&#39;而不是&#39; A&#39;。

2 个答案:

答案 0 :(得分:3)

无需再次创建tmp然后rbind。您可以按如下方式使用duplicated函数:

dt[label != "A" | !duplicated(dt, by=c("label", "id"))]
#    label id
# 1:     A  1
# 2:     B  2
# 3:     B  2
# 4:     C  3
# 5:     A  4
# 6:     A  5

如果您想在多个标签上执行此操作:

dt[!label %in% c("A", "C") | !duplicated(dt, by=c("label", "id"))]

请参阅?duplicated,详细了解data.table中的重复数据删除功能。

答案 1 :(得分:1)

这也可以使用if/else条件

来完成
dt[, if(all(label=='A')) .SD[1L] else .SD, by = id]
#   id label
#1:  1     A
#2:  2     B
#3:  2     B
#4:  3     C
#5:  4     A
#6:  5     A