簡體   English   中英

根據特定條件刪除重復項

[英]Remove duplicates based on specific criteria

我有一個看起來像這樣的數據集:

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 Num 值刪除重復行,但要根據以下條件刪除重復行: df$Company == 'NA' | df$Amount == 0 df$Company == 'NA' | df$Amount == 0

換句話說,刪除記錄 1、3 和 5。

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

代碼運行沒有錯誤,但實際上並沒有根據所需的條件刪除重復的行。 我認為這是因為我告訴它刪除任何符合這些標准的重復Claim.Num ,但不刪除任何重復的Claim.Num而是優先處理某些Claim.Num & Companies 以進行刪除。 請注意,我不能根據指定的值簡單地過濾掉數據集,因為還有其他可能具有 0 或 NA 值的記錄需要包含在內(例如,不應排除記錄 8 和 9,因為它們的 Claim.Nums不重復)。

如果您先訂購您的數據框,那么您可以確保duplicated保留您想要的:

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>

略有不同的做法

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列。

另一種基於subset和邏輯索引的方法:

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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM