首页 > 解决方案 > 如何使用 group_by() 显示最早日期

问题描述

我有一个名为master_table488 行的 9 个变量的小标题。与问题相关的两个变量是wrestler_namereign_beginwrestler_name某些值有多次重复。我想将行减少为每个唯一wrestler_name值的一个实例,由最早的reign_begin日期值决定。示例标题链接如下:

因此,在 tibble 的这一部分中,最终目标将是只有 5 行而不是 11 行,例如,单个 Ric Flair 行的统治开始日期为 1981 年 9 月 17 日,是四个中最早的Ric Flairreign_begin价值观。

我认为这group_by是最有意义的,但我越想它并尝试使用它,我就越认为它可能不是正确的道路。以下是我尝试过的一些事情:

  group_by(wrestler_name) %>% 
  tibbletime::filter_time(reign_begin, 'start' ~ 'start') 
#Trying to get it to just filter the first date it finds for each wrestler_name group, but did not work

master_table_2 <- master_table %>% 
  group_by(wrestler_name) %>% 
  filter(reign_begin)  
#I know that this would not work, but its the place I'm basically stuck

编辑:根据请求,这里是head(master_table),其中包含略有不同的数据,但它仍然表达了问题:

1      Ric Flair  NWA World Heavyweight Championship              40            8          69   1991-01-11 1991-03-21
2           Sting NWA World Heavyweight Championship              39            1         188   1990-07-07 1991-01-11
3      Ric Flair  NWA World Heavyweight Championship              38            7         426   1989-05-07 1990-07-07
4 Ricky Steamboat NWA World Heavyweight Championship              37            1          76   1989-02-20 1989-05-07
5      Ric Flair  NWA World Heavyweight Championship              36            6         452   1987-11-26 1989-02-20
6   Ronnie Garvin NWA World Heavyweight Championship              35            1          62   1987-09-25 1987-11-26
                   city_state country
1 East Rutherford, New Jersey     USA
2         Baltimore, Maryland     USA
3        Nashville, Tennessee     USA
4           Chicago, Illinois     USA
5           Chicago, Illinois     USA
6           Detroit, Michigan     USA

标签: rdplyr

解决方案


对数据库执行此操作的常用方法涉及连接:

earliest <- master_table %>%
  group_by(wrestler_name) %>%
  summarise(reign_begin = min(reign_begin)

master_table_2 <- master_table %>%
  inner_join(earliest, by = c("wrestler_name", "reign_begin"))

不需要过滤器,因为内部连接仅包括重叠。

数据库通常需要上述方法,因为它们如何计算摘要。但是正如@Martin_Gal 建议的那样,R 可以以不同的方式处理这个问题,因为它将数据存储在内存中。

master_table_2 <- master_table %>%
  group_by(wrestler_name) %>%
  filter(reign_begin == min(reign_begin))

您可能还会发现lubridate安装软件包有助于处理日期。


推荐阅读