[英]Eliminate all duplicates except NA values in R
我想消除NA
值以外的所有重復項。
我有這個文件:
Name weight
John . 10
John . 12
NA . 12
NA . 12
NA . 13
Peter . 15
Andy . 16
Clark . 17
我需要這個:
Name weight
NA . 12
NA . 12
NA . 13
Peter . 15
Andy . 16
Clark . 17
我嘗試了這段代碼:
New.dt=dt[!(duplicated(dt$Name) | duplicated(dt$Name, fromLast = TRUE)), ]
但是我可以這樣:
Name weight
Peter . 15
Andy . 16
Clark . 17
我想保留NA
值。
又快又臟
New.dt=dt[!(duplicated(dt$Name) | duplicated(dt$Name, fromLast = TRUE)), ]
dt2 = dt[dt$Name = is.na(dt)]
rbind(New.dt, dt2)
雙擊duplicated
的速度更快(我認為使用較大的數據duplicated
的效率會稍低),我建議您選擇該答案。
我的答案留作記錄。
使用duplicated
一個問題是它將永遠不會刪除所有重復項,因為一個重復項會刪除除其中一個之外的所有重復項,因此不再重復。
單線:
x[ !x$Name %in% names(Filter(c, table(x$Name, useNA = "no") - 1)), ]
# Name weight
# 3 <NA> 12
# 4 <NA> 12
# 5 <NA> 13
# 6 Peter 15
# 7 Andy 16
# 8 Clark 17
說明:
table(x$Name, ...)
將為您提供一個命名向量,其中包含Name
列中每個元素的計數; table(..., useNA="no")
來明確表示,這意味着NA
值不包含在返回的計數向量中(從而滿足“ NA值除外”)約束); Filter(c, ...)
根據內容的真實值過濾命名的矢量,其中“ 0”被認為是不真實的(因此已刪除)...但是由於table
將始終返回1或更大(因為它必須找到一個將其包括在列表中),... table(...) - 1
將所有單打(計數為1)減少為0,以便Filter(c,...)
部分可以工作; names(...)
返回有效計數為2或更大的Name
值; 和 !x$Name %in% ...
進行實際刪除。 數據
x <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "
Name weight
John 10
John 12
NA 12
NA 12
NA 13
Peter 15
Andy 16
Clark 17")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.