首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据特定标准删除重复项

根据特定标准删除重复项
EN

Stack Overflow用户
提问于 2014-02-14 19:52:47
回答 3查看 3.8K关注 0票数 0

我有一个如下所示的数据集:

代码语言:javascript
复制
df <- structure(list(Claim.Num = c(500L, 500L, 600L, 600L, 700L, 700L, 
100L, 200L, 300L), Amount = c(NA, 1000L, NA, 564L, 0L, 200L, 
NA, 0L, NA), Company = structure(c(NA, 1L, NA, 4L, 2L, 3L, NA, 
3L, NA), .Label = c("ATT", "Boeing", "Petco", "T Mobile"), class = "factor")), .Names =     
c("Claim.Num", "Amount", "Company"), class = "data.frame", row.names = c(NA, 
-9L))

我希望根据Claim值删除重复行,但是要根据以下条件删除重复行:df$Company == 'NA' | df$Amount == 0

换句话说,删除记录1、3和5。

我已经走了这么远:df <- df[!duplicated(df$Claim.Num[which(df$Amount = 0 | df$Company == 'NA')]),]

代码运行时没有错误,但实际上并没有根据所需的条件删除重复行。我认为这是因为我告诉它删除符合这些标准的任何重复索赔Num,但不是删除任何重复的Claim.Num,而是处理某些金额&公司优先考虑删除。请注意,我不能简单地根据指定的值筛选出数据集,因为还有其他可能具有0或NA值的记录需要包含(例如,不应排除记录8和9,因为它们的Claim.Nums不重复)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-14 20:04:21

如果首先对数据帧进行排序,则可以确保duplicated保留所需的数据帧:

代码语言:javascript
复制
df.tmp <- with(df, df[order(ifelse(is.na(Company) | Amount == 0, 1, 0)), ])
df.tmp[!duplicated(df.tmp$Claim.Num), ]
#   Claim.Num Amount  Company
# 2       500   1000      ATT
# 4       600    564 T Mobile
# 6       700    200    Petco
# 7       100     NA     <NA>
# 8       200      0    Petco
# 9       300     NA     <NA>
票数 2
EN

Stack Overflow用户

发布于 2014-02-14 20:46:32

略有不同的方法

代码语言:javascript
复制
r <- merge(df,
           aggregate(df$Amount,by=list(Claim.Num=df$Claim.Num),length),
           by="Claim.Num")
result <-r[!(r$x>1 & (is.na(r$Company) | (r$Amount==0))),-ncol(r)]
result
#   Claim.Num Amount  Company
# 1       100     NA     <NA>
# 2       200      0    Petco
# 3       300     NA     <NA>
# 5       500   1000      ATT
# 7       600    564 T Mobile
# 9       700    200    Petco

这将添加一个列x,以指示哪些行有不止一次Claim.Num,然后根据您的条件筛选结果。-ncol(r)的使用只是删除了末尾的列x

票数 0
EN

Stack Overflow用户

发布于 2014-02-14 20:56:06

另一种基于subset和逻辑索引的方法:

代码语言:javascript
复制
subset(dat, !(duplicated(Claim.Num) | duplicated(Claim.Num, fromLast = TRUE)) |  
         (!is.na(Amount) & Amount))

  Claim.Num Amount  Company
2       500   1000      ATT
4       600    564 T Mobile
6       700    200    Petco
7       100     NA     <NA>
8       200      0    Petco
9       300     NA     <NA>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21788378

复制
相关文章

相似问题

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