【问题标题】:Subsetting data by date range across years in RR中跨年份的日期范围子集数据
【发布时间】:2020-04-10 10:06:55
【问题描述】:

我有一个已识别个人的长期目击数据集(从 1979 年到 2019 年的大约 16,000 条记录),我想对同一日期范围(YYYY-09-01 到 YYYY(+1) >)-08-31) 在 R 中跨年。我已经成功地为每个“年”(并获得了唯一的 ID)使用:

library(dplyr)
library(lubridate)

year79 <-data%>%
  select(ID, Sex, AgeClass, Age, Date, Month, Year)%>%
  filter(Date>= as.Date("1978-09-01") & Date<= as.Date("1979-08-31")) %>%
  filter(!duplicated(ID))

year80 <-data%>%
  select(ID, Sex, AgeClass, Age, Date, Month, Year)%>%
  filter(Date>= as.Date("1979-09-01") & Date<= as.Date("1980-08-31")) %>%
  filter(!duplicated(ID))

我想清理代码,理想情况下不需要指定每个范围(只需让它遍历)。我是 R 的新手并且坚持如何做到这一点。有什么建议吗?

仅供参考,“月”和“年”包含在稍后通过meltcast 生成表格时。

示例数据:

    ID Year   Month Day  Date       AgeClass Age Sex
1 1034 1979     4  17 1979-04-17        U   3   F
2 1127 1979     5   3 1979-05-03        A  13   F
3 1222 1979     5   3 1979-05-03        U   0   F
4 1303 1979     6  16 1979-06-16        U   0   F
5 1153 1980     4  16 1980-04-16        C   0   F
6 1014 1980     4  16 1980-04-16        U   6   F
                  ID Year   Month Day  Date       AgeClass Age  Sex
16428           2503 2019     5   8 2019-05-08        U  NA    F
16429           3760 2019     5   8 2019-05-08        A  12    F
16430           4080 2019     5   9 2019-05-09        A   9    F
16431           4095 2019     5   9 2019-05-09        A   9    U
16432           1204 2019     5  11 2019-05-11        A  37    F
16433           1204 2019     5  11 2019-05-11        A  NA    F

#> sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

【问题讨论】:

标签: r dataframe date subset date-range


【解决方案1】:

每年从 9 月 1 日到 12 月 31 日(含)有 122 天,因此您可以为每一行添加一个标记“会计年度”的变量:

set.seed(42)
library(dplyr)
my_data <- tibble(ID = 1:6,
                  Date = as.Date("1978-09-01") + c(-1, 0, 1, 364, 365, 366))
my_data
# There are 122 days from each Aug 31 (last of the FY) to the end of the CY.
# lubridate::ymd(19781231) - lubridate::ymd(19780831)

my_data %>%
  mutate(FY = year(Date + 122))

## A tibble: 6 x 3
#     ID Date          FY
#  <int> <date>     <dbl>
#1     1 1978-08-31  1978
#2     2 1978-09-01  1979
#3     3 1978-09-02  1979
#4     4 1979-08-31  1979
#5     5 1979-09-01  1980
#6     6 1979-09-02  1980

您可以将数据保存在一个表中,然后使用group_by(FY)use %&gt;% split(.$FY) 进行后续分析,将每个 FY 放入列表的自己的元素中。根据我有限的经验,我认为为数据的年度子集创建单独的数据框通常是一种反模式,因为这会使您的代码更难维护、排除故障和修改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-07
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多