删除重复项,同时在R中保留NA

时间:2018-01-25 17:30:10

标签: r dataframe

我的数据如下所示:

a<-data.frame(ID=c("A","B","C","C",NA,NA),score=c(1,2,3,3,5,6),stringsAsFactors=FALSE)
print(a)
ID score
A     1
B     2
C     3
C     3
<NA>  5
<NA>  6

我正在尝试删除重复项而不将R <NA>视为重复项以获取以下内容:

b<-data.frame(ID=c("A","B","C",NA,NA),score=c(1,2,3,5,6),stringsAsFactors=FALSE)
print(b)
ID score
A     1
B     2
C     3
<NA>  5
<NA>  6

我尝试了以下内容:

b<-a[!duplicated(a$ID),]
library(dplyr)
b<-distinct(a,ID)
print(b)

但是他们都将<NA>视为重复的ID并删除了一个,但我希望保留<NA>的所有实例。思考?谢谢!

3 个答案:

答案 0 :(得分:3)

直接的方法是将原始数据帧分解为2个部分,其中ID为NA,而不是。执行不同的过滤器,然后将数据框组合在一起:

a<-data.frame(ID=c("A","B","C","C",NA,NA),score=c(1,2,3,3,5,6),stringsAsFactors=FALSE)

aprime<-a[!is.na(a$ID),]
aNA<-a[is.na(a$ID),]

b<-aprime[!duplicated(aprime$ID),]

b<-rbind(b, aNA)

通过一些工作,可以将其减少到1-2行代码。

答案 1 :(得分:1)

使用dplyr:

   b%>%group_by(ID,score)%>%distinct()


# A tibble: 5 x 2
# Groups:   ID, score [5]
     ID score
  <chr> <dbl>
1     A     1
2     B     2
3     C     3
4  <NA>     5
5  <NA>     6

答案 2 :(得分:0)

找到了一种非常简单的方法,只需使用基本的plicated()函数即可。

b<-a[!duplicated(a$ID, incomparables = NA),]

设置无与伦比= NA使R读取NA重复项为FALSE,因此将其包含在结果数据集中。