消除R中的NA值以外的所有重复项

时间:2019-06-03 22:56:49

标签: r dataframe

我想消除除\\值以外的所有重复项。

我有这个文件:

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 的值。

2 个答案:

答案 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")