我有一个已确定个人的长期目击数据集(从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的新手,并且卡住了该怎么做。有什么建议吗?
FYI“月”和“年”被包括在内,以便稍后通过melt
和cast
生成表格。
示例数据:
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
[每年从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 %>% split(.$FY)
进行后续分析,以将每个FY放入其自己的列表元素中。根据我有限的经验,我认为为年度数据子集创建单独的数据帧通常是一种反模式,因为这会使您的代码难以维护,故障排除和修改。