извлечь подмножество фрейма данных, где записи разделены определенным периодом времени - PullRequest
1 голос
/ 17 января 2012

(я изменил этот вопрос, чтобы сделать его более явным.)

У меня есть следующий набор данных:

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 ]

1 голос
/ 17 января 2012

Как насчет:

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 голосов
/ 17 января 2012

Это сработает, хотя я уверен, что кто-то другой может дать вам лучший ответ.

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.

Обратите внимание, что мой ответ не очень хорошо обобщает.Если у меня будет больше времени, я постараюсь обобщить это.Но это должно работать на данный момент.

...