2013-02-20 1 views
1

моего набор данные выглядит следующим образом:Как просмотреть дублированные записи с одним или несколькими NA?

ID Score 
A1 60 
A1 50 
A1 NA 
B1 30 
B1 33 
C1 48 
C1 39 
D1 21 
D1 38 
D1 NA 

Я хотел бы видеть дублирующие записи, которые имеют НС. Такие, как:

A1 60 
A1 50 
A1 NA 
D1 21 
D1 38 
D1 NA 

Спасибо за ваше время и доброе внимание ...

ответ

3

Там может быть немного аккуратнее способ сделать это:

df <- data.frame(ID=rep(c("A1", "B1", "C1"), each=4), Score=sample(1:100,12)) 
df$Score[c(1,7)] <- NA 

df[df$ID %in% df$ID[which(is.na(df$Score))],] 
+0

Отличные решения .... Спасибо !!! –

4

Несколько подходов с использованием data.table ,

Предполагая, что ваши данные в data.frame называется DF

library(data.table) 
DT <- data.table(DF, key = 'ID') 

# self join with the ID values with NA values in score 

DT[.(DT[is.na(Score),unique(ID)])] 

# or 

DT[,if(any(is.na(Score))) {.SD},by=ID] 
4

Подход с использованием ave. Compose добавленными для удовольствия:

require(functional) 
DF[as.logical(ave(DF$Score, DF$ID, FUN=Compose(is.na, any))),] 
## ID Score 
## 1 A1 60 
## 2 A1 50 
## 3 A1 NA 
## 8 D1 21 
## 9 D1 38 
## 10 D1 NA 
+2

+ 1 для каламбура! – mnel

+1

Без необходимости в пакете 'functional':' DF [as.logical (ave (DF $ Score, DF $ ID, FUN = function (x) any (is.na (x)))),] ' – thelatemail

0

вы можете попробовать это

 mydata<-data.frame(ID=c(rep("A1",3),rep("B1",2),rep("C1",2),rep("D1",3)),Score=c(60,50,NA,30,33,48,39,21,38,NA)) 

    mydata[mydata$ID%in%unique(mydata$ID)[-which(is.na(as.vector(tapply(mydata$Score,mydata$ID,FUN=function(x){match(NA,x)}))))],] 
Смежные вопросы