2013-01-12 2 views
2

변수 s의 반복 된 값에 따라 데이터 집합의 하위 집합을 만드는 방법을 알아 내려고 행에 연결된 id도 고려합니다.조건부로 data.frame에서 조건부로 데이터를 삭제합니다.

내 데이터 세트는 가정 : 내가하고 싶은 무엇

dat <- read.table(text = " 
     id  s   
     1  2  
     1  2  
     1  1  
     1  3  
     1  3  
     1  3  
     2  3  
     2  3  
     3  2  
     3  2", 
header=TRUE) 

이며, 각 id를 들어, s = 3에 대한 첫 번째 행을 유지합니다. 내가 두 번째 순간에 subset()을 사용하는 duplicated()which()를 모두 사용하는 것을 시도했다

 id  s   
     1  2  
     1  2  
     1  1  
     1  3   
     2  3   
     3  2  
     3  2 

,하지만 난 아무데도 안 오전 : dat와 결과는 것입니다. 가장 큰 문제는 어떤 경우에는 (id = 1id = 2 사이에서) 하나의 ID와 다른 ID 사이에 3이 겹치기 때문에 s = 3 "블록"의 첫 번째 행을 분리하는 것만으로는 충분하지 않다는 것입니다. 어떤 전략을 채택하겠습니까? 이처럼

+1

이 또한 ID의 중복입니다 = 1 여기서 s = 2이고 id = 3 인 s = 2인데, 이것을 유지하거나 제거하고 싶습니까? –

+0

예, 나는 그들을 지키고 싶습니다. – Stezzo

답변

2

:

subset(dat, s != 3 | s == 3 & !duplicated(dat)) 
# id s 
# 1 1 2 
# 2 1 2 
# 3 1 1 
# 4 1 3 
# 7 2 3 
# 9 3 2 
# 10 3 2 

subset이 (Why is `[` better than `subset`? 참조) 작업 위험 할 수 있으므로 수있는 긴하지만 안전 버전은 다음과 같습니다

dat[dat$s != 3 | dat$s == 3 & !duplicated(dat), ] 
+0

고마워요! 또한 링크 – Stezzo

+0

에 대한 죄송합니다, 나는 당신의 데이터를 봐야할지 모르겠다. – flodel

관련 문제