2012-01-17 58 views
1

分離的一個子集提取的數據幀,其中記錄由一個特定的時間段

我有一個數據集如下(我已經修改了這個問題,使之更加明確。):

data <- structure(list(id = 1:12, personID = c(1L, 2L, 3L, 4L, 4L, 3L, 2L, 1L, 1L, 2L, 3L, 4L), lastName = structure(c(1L, 2L, 3L, 4L, 4L, 3L, 2L, 1L, 1L, 2L, 3L, 4L), .Label = c("james", "joan", "lucy", "mary"), class = "factor"), date = structure(c(5L, 5L, 8L, 9L, 6L, 1L, 3L, 11L, 4L, 2L, 7L, 10L), .Label = c("1/01/2012", "10/04/2011", "11/01/2012", "11/08/2011", "12/01/2012", "12/04/2012", "12/12/2011", "14/01/2012", "16/01/2012", "24/06/2010", "24/06/2011" ), class = "factor"), status = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L)), .Names = c("id", "personID", "lastName", "date", "status"), class = "data.frame", row.names = c(NA, -12L ))

我需要從數據框中提取一個子集,以包含在大於8周的時間內每行發生超過一次的記錄。

提取需要從最早的記錄搜索,然後選擇下一個(最近)的額外的相同PERSONID,這是因爲以前的記錄大於8週記錄。在找到比8周更早的另一個記錄時,應該使用最近的第二條記錄作爲新的起點重複該過程。

謝謝。

回答

1

如何:

maxDiff <- tapply(data$date,data$personID,function(x) max(dist(x))) 
subset(data,personID %in% names(maxDiff[maxDiff>(8*7)])) 
    id personID lastName  date status 
1 1  1 james 2012-01-12  1 
4 4  4  mary 2012-01-16  1 
5 5  4  mary 2012-04-12  1 
8 8  1 james 2011-06-24  1 
+0

這將挑選出的每個人的最分隔雙記錄,提供分離超過8周。但是,如果一個人在第1天,第90天,第200天有記錄,那麼OP可能需要該人的所有* 3 *記錄。這需要由@John澄清。 – 2012-01-17 13:43:00

+0

@PrasadChalasani好點,我會再考慮一下。 'expand.grid'可能是需要的。 – James 2012-01-17 14:07:51

+0

@PrasadChalasani其實'dist'的伎倆相當不錯 – James 2012-01-17 14:21:50

0

這將這樣的伎倆,但我敢肯定,別人可以給你更好的答案。

require(plyr) 

diffWeek <- function (df) { 
    abs(df$date[1] - df$date[2])} 

eightWeeks <- 7*8 # 56 days 
aux.data <- ddply(data, "lastName", function (df) diffWeek(df) > eightWeeks) 

data[data$lastName %in% aux.data[aux.data[,2]==T,1],] # this willreturn the data.frame. 

請注意,我的回答沒有很好地概括。如果我有更多的時間,我會盡量推廣它。但它現在應該工作。

相關問題