过滤当年的最新日期

问题描述 投票:0回答:2

下表是我手头的数据样本。我想通过仅具有该特定年份的最新日期的行进行过滤。

从我的主要数据集中,我首先使用下面的代码进行过滤,它为我提供了如下行的数据:

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
r dplyr portfolio
2个回答
0
投票
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


0
投票

我不确定预期的输出是什么,但如果您只想要来自 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

© www.soinside.com 2019 - 2024. All rights reserved.