我想改进我的代码。我们假设您要删除具有相同标签的重复行'并且' 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;。
答案 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