我想改进我的代码。假设您希望删除具有相同“标签”和“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注意,第3行和第4行保持重复,因为标签等于“B”,而不是“A”。
发布于 2015-10-24 01:50:03
不需要创建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中去复制函数的更多信息。
发布于 2015-10-24 06:30:05
这也可以使用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 Ahttps://stackoverflow.com/questions/33313561
复制相似问题