下表是我手头的数据样本。我想通过仅具有该特定年份的最新日期的行进行过滤。
从我的主要数据集中,我首先使用下面的代码进行过滤,它为我提供了如下行的数据:
DATA %>%
mutate(Year = year(report_dt), Month = month(report_dt)) %>%
group_by(Year, ID) %>%
slice(which.max(as.Date(report_dt, '%m/%d/%Y')))
report_dt | 公司 | ID | 年 | 月份 |
---|---|---|---|---|
2012-09-30 | 亚马逊公司 | 02313510 | 2012 | 9 |
2012-09-30 | 卡夫食品公司 | 50075N10 | 2012 | 9 |
2012-10-31 | 宏联集团 | 68191910 | 2012 | 10 |
2012-11-30 | 卡夫食品集团公司 | 50076Q10 | 2012 | 11 |
2012-12-31 | 雅培实验室 | 00282410 | 2012 | 12 |
2012-12-31 | AMERISOURCEBERGEN CORP | 03073E10 | 2012 | 12 |
2012-12-31 | 苹果公司 | 03783310 | 2012 | 12 |
2012-12-31 | BED BATH & BEYOND INC | 07589610 | 2012 | 12 |
代码适用于第一步,但现在,例如,我只想要那些带有“2012-12-31”的行。我尝试再次使用
slice
,但我认为它不是这样工作的。最后我也试了:%>% filter(Month == max(Month))
但是没有用。
我按年份对它们进行了分组,因为我每年都需要做同样的事情。如果此信息有帮助,我的最终目标是仅使用一年中最晚日期的 ID 创建投资组合)。 谢谢
编辑:这是我想要的示例结果(然后每年复制它)。删除不在该特定年份的最大日期中的行。
report_dt | 公司 | ID | 年 | 月份 |
---|---|---|---|---|
2012-12-31 | 雅培实验室 | 00282410 | 2012 | 12 |
2012-12-31 | AMERISOURCEBERGEN CORP | 03073E10 | 2012 | 12 |
2012-12-31 | 苹果公司 | 03783310 | 2012 | 12 |
2012-12-31 | BED BATH & BEYOND INC | 07589610 | 2012 | 12 |
library(tidyverse)
library(lubridate)
df <- tibble::tribble(
~report_dt, ~Company, ~ID, ~YEAR, ~MONTH,
"2012-09-30", "AMAZON COM INC", "02313510", 2012L, 9L,
"2012-09-30", "KRAFT FOODS INC", "50075N10", 2012L, 9L,
"2012-10-31", "OMNICOM GROUP INC", "68191910", 2012L, 10L,
"2012-11-30", "KRAFT FOODS GROUP INC", "50076Q10", 2012L, 11L,
"2012-12-31", "ABBOTT LABORATORIES", "00282410", 2012L, 12L,
"2012-12-31", "AMERISOURCEBERGEN CORP", "03073E10", 2012L, 12L,
"2012-12-31", "APPLE INC", "03783310", 2012L, 12L,
"2012-12-31", "BED BATH & BEYOND INC", "07589610", 2012L, 12L
)
df |>
mutate(report_dt = ymd(report_dt)) |>
slice_max(report_dt, by = c(ID, YEAR))
#> # A tibble: 8 × 5
#> report_dt Company ID YEAR MONTH
#> <date> <chr> <chr> <int> <int>
#> 1 2012-09-30 AMAZON COM INC 02313510 2012 9
#> 2 2012-09-30 KRAFT FOODS INC 50075N10 2012 9
#> 3 2012-10-31 OMNICOM GROUP INC 68191910 2012 10
#> 4 2012-11-30 KRAFT FOODS GROUP INC 50076Q10 2012 11
#> 5 2012-12-31 ABBOTT LABORATORIES 00282410 2012 12
#> 6 2012-12-31 AMERISOURCEBERGEN CORP 03073E10 2012 12
#> 7 2012-12-31 APPLE INC 03783310 2012 12
#> 8 2012-12-31 BED BATH & BEYOND INC 07589610 2012 12
创建于 2023-03-24 与 reprex v2.0.2
我不确定预期的输出是什么,但如果您只想要来自 Dez 31 的条目,那么下面的方法可能会有所帮助:
library(dplyr)
library(lubridate)
DATA %>%
mutate(Year = year(report_dt),
Month = month(report_dt)) %>%
filter(report_dt == as.Date(paste0(YEAR, "-12-31")), .by = c(YEAR, ID))
#> # A tibble: 4 × 7
#> report_dt Company ID YEAR MONTH Year Month
#> <date> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 2012-12-31 ABBOTT LABORATORIES 00282410 2012 12 2012 12
#> 2 2012-12-31 AMERISOURCEBERGEN CORP 03073E10 2012 12 2012 12
#> 3 2012-12-31 APPLE INC 03783310 2012 12 2012 12
#> 4 2012-12-31 BED BATH & BEYOND INC 07589610 2012 12 2012 12
来自 OP 的数据
DATA <- tribble(~report_dt, ~Company, ~ID, ~YEAR, ~MONTH,
"2012-09-30", "AMAZON COM INC", "02313510", 2012, 9 ,
"2012-09-30", "KRAFT FOODS INC", "50075N10", 2012, 9 ,
"2012-10-31", "OMNICOM GROUP INC", "68191910", 2012, 10,
"2012-11-30", "KRAFT FOODS GROUP INC", "50076Q10", 2012, 11,
"2012-12-31", "ABBOTT LABORATORIES", "00282410", 2012, 12,
"2012-12-31", "AMERISOURCEBERGEN CORP", "03073E10", 2012, 12,
"2012-12-31", "APPLE INC", "03783310", 2012, 12,
"2012-12-31", "BED BATH & BEYOND INC", "07589610", 2012, 12
) %>%
mutate(report_dt = as.Date(report_dt))
创建于 2023-03-24 与 reprex v2.0.2