我的数据如下所示:
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>
的所有实例。思考?谢谢!
答案 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,因此将其包含在结果数据集中。