【问题标题】:Distinct rows based on date range基于日期范围的不同行
【发布时间】:2015-04-09 11:10:14
【问题描述】:

我有一个大型数据集,其结构如下:

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")

我想查找包含上一个 x 个月期间未记录的变量组合的每一行。因此,当我寻找前 3 个月未记录的 pathogenvariant 的组合时,我来自:

         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 方法会是什么样子?

【问题讨论】:

  • 将您的日期范围划分为 x 个月间隔并报告出现在每个间隔中的那些组合是否满足您的需求?
  • 我确实考虑过使用 cut 函数做类似的事情,但如果变量组合存在三个月,并且其中一个休息时间落在那个时期内,我会得到重复,我不想。

标签: r dplyr


【解决方案1】:

我不确定处理确切月份间隔的最佳方法,但为了让您开始,您可以按如下方式计算天数差异(产生与问题中所示相同的输出):

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

【讨论】:

  • 太棒了!我所有的观察都是在本月 1 日,所以除非我需要回到几年前,否则应该这样做。
  • @patabongo,如果所有观察结果都在本月 1 日,您可能希望将天数减少到 3*27 或更少,以避免错误结果,例如二月
  • 我在午餐时去散步,并意识到我可以通过以下方式根据月份进行过滤:library(zoo)df %>% mutate(months_from = (as.yearmon(date) - min(as.yearmon(date))) * 12) %>% group_by(pathogen, variant) %>% filter(c(TRUE, diff(months_from) > 3)) %>% select(-months_from)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
相关资源
最近更新 更多