我有如下所示的数据:
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>的所有实例。有什么想法?谢谢!
发布于 2018-01-26 01:56:50
一种直接的方法是将原始数据帧分为两部分,其中ID是NA,而ID不是。执行distinct过滤器,然后将数据帧重新组合在一起:
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行代码。
发布于 2018-01-26 01:32:44
使用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发布于 2020-09-23 21:59:51
找到一种非常简单的方法,只需使用基本的duplicated()函数即可完成此操作。
b<-a[!duplicated(a$ID, incomparables = NA),]设置incomparables = NA会使R将NA副本读取为FALSE,从而将它们包含在结果数据集中。
https://stackoverflow.com/questions/48448741
复制相似问题