首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >data.table :删除给定索引值的重复行子集

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

Stack Overflow用户
提问于 2015-10-24 01:21:14
回答 2查看 203关注 0票数 0

我想改进我的代码。假设您希望删除具有相同“标签”和“id”的重复行。我的做法是:

代码语言:javascript
复制
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行.)

谢谢!

示例:

代码语言:javascript
复制
label id
A     1
A     1
B     2
B     2
C     3
A     4
A     5
A     5

将给予:

代码语言:javascript
复制
label id
A     1
B     2
B     2
C     3
A     4
A     5

注意,第3行和第4行保持重复,因为标签等于“B”,而不是“A”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-24 01:50:03

不需要创建tmp,然后再创建rbind。您可以简单地使用duplicated函数如下:

代码语言:javascript
复制
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

如果您想在几个标签上这样做:

代码语言:javascript
复制
dt[!label %in% c("A", "C") | !duplicated(dt, by=c("label", "id"))]

请参阅?duplicated了解有关data.table中去复制函数的更多信息。

票数 3
EN

Stack Overflow用户

发布于 2015-10-24 06:30:05

这也可以使用if/else条件来完成。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33313561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档