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

相關問題