2013-02-07 4 views
1

여러 조건으로 표를 부분 집합화해야합니다.날짜와 순서로 표를 부분 집합하는 방법은 무엇입니까?

df <- data.frame(id=c("A","A","B","B","B","C"), seq=c(1,2,1,2,3,1), date=as.Date(c("2005-10-01", "2008-12-01","2001-03-05","2004-05-09","2008-10-15","2010-02-27")), value=c(20,12,80,55,77,57)) 


    id | seq |  date | value 
-------------------------------- 
    A | 1 | 2005-10-01 | 20 
    A | 2 | 2008-12-01 | 12 
    B | 1 | 2001-03-05 | 80 
    B | 2 | 2004-05-09 | 55 
    B | 3 | 2008-10-15 | 77 
    C | 1 | 2010-02-27 | 57 

각 id마다 정확히 하나의 값을 반환하는 메서드가 필요합니다. 특히 시퀀스의 값이이고 날짜가 주어진 날짜보다 작거나 같은 값은입니다. 2004-07-01 말을 감안할 때, 그것은 반환해야합니다 :

id | value 
-------------- 
A | 20 
B | 55 
C | 57 

(날짜가 첫 데이트보다 적은 경우 특별한 경우에 그주의, 그것은 서열 = 1,하지 아무것도 돌려주지해야한다)

이 가능 ? 한마디로?

답변

1

이와 비슷한?

with(df[df$date >= as.Date("2004-07-01"),], do.call("rbind", lapply(split(data.frame(id, value,seq), id), function(x) x[which.max(x$value), c("id", "value")]))) 
    id value 
A A 20 
B B 77 
C C 57 
+0

+1 멋진 라이너! – Ben

+0

좋은 노력! 그러나 올바른 답을주지는 못합니다. – jenswirf

+0

결과가 다르다는 것을 알았지 만 ID B의 값 55가 원하는 시작점보다 작거나 뭔가 빠졌습니까? – johannes

관련 문제