簡體   English   中英

消除R中的NA值以外的所有重復項

[英]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.

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