提取数据帧的子集,其中记录按特定时间段分隔

时间:2012-01-17 13:09:34

标签: r dataframe subset datediff

(我已修改此问题以使其更明确。)

我有一个数据集如下:

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周的记录时,它应该使用最近的第二条记录作为新的起点重复该过程。

感谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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.

请注意,我的答案并不能很好地概括。如果我有更多时间,我会尝试概括它。但它现在应该有效。