2015-04-09 2 views
3

У меня есть большой иш набор данных со структурой что-то вроде следующего:Отдельные строки на основе диапазона дат

structure(list(pathogen = c("MRSA", "L. pneumophila", "MRSA", 
"L. pneumophila", "MRSA", "MRSA", "MRSA", "L. pneumophila", "L. pneumophila", 
"MRSA"), variant = c("mecA", "sg1", "mecA", "sg1", "mecA", "mecC", 
"mecA", "sg1", "sg6", "mecA"), n = c(25L, 14L, 235L, 2L, 64L, 
15L, 13L, 6L, 11L, 8L), date = structure(c(15156, 15248, 15279, 
15279, 15309, 15340, 15340, 15400, 15431, 15461), class = "Date")), .Names = c("pathogen", 
"variant", "n", "date"), row.names = c(NA, -10L), class = "data.frame") 

Я хочу, чтобы найти все строки с комбинацией переменных, которые не были записаны в предыдущей х-месячный период. Поэтому, когда я смотрю на комбинации pathogen и variant, который не был записан в предыдущие 3 месяца я иду от:

  pathogen variant n  date 
1   MRSA mecA 25 2011-07-01 
2 L. pneumophila  sg1 14 2011-10-01 
3   MRSA mecA 235 2011-11-01 
4 L. pneumophila  sg1 2 2011-11-01 
5   MRSA mecA 64 2011-12-01 
6   MRSA mecC 15 2012-01-01 
7   MRSA mecA 13 2012-01-01 
8 L. pneumophila  sg1 6 2012-03-01 
9 L. pneumophila  sg6 11 2012-04-01 
10   MRSA mecA 8 2012-05-01 

к:

  pathogen variant n  date 
1   MRSA mecA 25 2011-07-01 
2 L. pneumophila  sg1 14 2011-10-01 
3   MRSA mecA 235 2011-11-01 
6   MRSA mecC 15 2012-01-01 
8 L. pneumophila  sg1 6 2012-03-01 
9 L. pneumophila  sg6 11 2012-04-01 
10   MRSA mecA 8 2012-05-01 

Все решения я думал так далеко связаны пишущие петли. Я также стараюсь использовать dplyr для анализа как можно больше, поэтому мой вопрос: это возможно в dplyr? И если нет, то каким будет подход R-ish?

+0

Будет ли он соответствовать вашим потребностям, чтобы разделить диапазон дат на х месяцев и сообщить о тех комбинациях, которые появляются в каждом интервале? –

+0

Я действительно делал что-то подобное, используя функцию 'cut', но если комбинация переменных присутствует три месяца, и один из перерывов приходится на этот период, я получу повторы, которые я не хочу. – patabongo

ответ

3

Я не уверен в лучшем способе обработки точных интерполяции месяца, но чтобы вы начали, вы могли бы вычислить разницу в количестве дней следующим образом (в результате получился тот же результат, что и в вопросе):

df %>% 
    group_by(pathogen, variant) %>% 
    filter(c(TRUE, diff(date) > 90)) # check for difference of 90 days 
#Source: local data frame [7 x 4] 
#Groups: pathogen, variant 
# 
#  pathogen variant n  date 
#1   MRSA mecA 25 2011-07-01 
#2 L. pneumophila  sg1 14 2011-10-01 
#3   MRSA mecA 235 2011-11-01 
#4   MRSA mecC 15 2012-01-01 
#5 L. pneumophila  sg1 6 2012-03-01 
#6 L. pneumophila  sg6 11 2012-04-01 
#7   MRSA mecA 8 2012-05-01 
+0

Блестящий! Все мои наблюдения находятся на 1-м месяце, поэтому это должно произойти, если мне не понадобится вернуться несколько лет назад. – patabongo

+0

@patabongo, если все наблюдения находятся на 1-м месяце, вы можете уменьшить количество дней до 3 * 27 или менее, чтобы избежать неправильных результатов, например. на февраль –

+0

Я пошел на прогулку на обед и понял, что могу фильтровать по месяцам: 'library (zoo)' и 'df%>% mutate (months_from = (as.yearmon (date) - min (%),% (%)% select – patabongo

Смежные вопросы