2017-09-08 5 views
-1

다른 열의 값을 기반으로 중복 행을 조건 적으로 제거해야하는 데이터 집합이 있습니다.조건부로 중복 제거 R

특히, SampleID가 복제 된 경우에만 size = 0 IF 인 모든 행을 삭제해야합니다.

SampleID<-c("a", "a", "b", "b", "b", "c", "d", "d", "e") 
size<-c(0, 1, 1, 2, 3, 0, 0, 1, 0) 
data<-data.frame(SampleID, size) 

I want to delete rows with: 
Sample ID size 
a   0 
d   0 

And keep: 
SampleID size 
a   1 
b   1 
b   2 
b   3 
c   0 
d   1 
e   0 

참고 실제 데이터 집합이 매우 큰, 그래서 난 그냥 행 번호에 의해 알려진 행을 제거하는 방법을 찾고 있지 않다.

+3

가 읽어 보시기 바랍니다 도움이되기를 바랍니다. –

+0

마지막 주석을 명확히하기 위해 : 제공 한 코드가 실행되지 않습니다. 게시하기 전에 새 R 세션의 예제를 테스트하십시오. – Frank

답변

0

data.table 프레임 워크를 사용 : data.table

require(data.table) 
setDT(data) 

에 세트 변환 행을 삭제할 수있는 ID 목록을 작성하십시오.

dropable_ids = unique(data[size != 0, SampleID]) 

하지 그 not(a and b)

data = data[!(SampleID %in% dropable_ids & size == 0), ] 

주의하십시오 가져다 놓을 목록에 비 0 값이있는 것은 a or b에 해당하지만 data.table 프레임 워크는 잘 or을 처리하지 않습니다. https://stackoverflow.com/help/how-to-ask을하고 재현성 예제를 만들 :

0

data.table없이 기본 R 작동 및 R의 우선 통해 따라하기 쉬운 솔루션 :

#Find all duplicates 

data$dup1 <- duplicated(data$SampleID) 
data$dup2 <- duplicated(data$SampleID, fromLast = TRUE) 
data$dup <- ifelse(data$dup1 == TRUE | data$dup2 == TRUE, 1, 0) 


#Subset to relevant 

data$drop <- ifelse(data$dup == 1 & data$size == 0, 1, 0) 
data2 <- subset(data, drop == 0)