(我已修改此问题以使其更明确。)
我有一个数据集如下:
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周的记录时,它应该使用最近的第二条记录作为新的起点重复该过程。
感谢。
答案 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.
请注意,我的答案并不能很好地概括。如果我有更多时间,我会尝试概括它。但它现在应该有效。