2013-02-07 62 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 

(请注意,在特殊情况下日期小于第一次约会,它应该返回指定seq = 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

相关问题