我想消除除\\
值以外的所有重复项。
我有这个文件:
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
的值。
答案 0 :(得分:3)
又快又脏
New.dt=dt[!(duplicated(dt$Name) | duplicated(dt$Name, fromLast = TRUE)), ]
dt2 = dt[dt$Name = is.na(dt)]
rbind(New.dt, dt2)
答案 1 :(得分:1)
连按两次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")