Find the minimum date between two maximum dates based off unique values in a column

chr*_*456 4 r data-manipulation dataframe dplyr

Data example.

date1 = seq(as.Date("2019/01/01"), by = "month", length.out = 29)
date2= seq(as.Date("2019/05/01"), by = "month", length.out = 29)

subproducts1=rep("1",29)
subproducts2=rep("2",29)

b1 <- c(rnorm(29,5))
b2 <- c(rnorm(29,5))

dfone <- data.frame("date"= c(date1,date2),
                "subproduct"= 
                  c(subproducts1,subproducts2),
                "actuals"= c(b1,b2))
Run Code Online (Sandbox Code Playgroud)

Max Date for Subproduct 1 is May 2021 and max date for Subproduct 2 is Sept 2021.

Question: Is there a way to:

  1. Find the max date for both unique subproduct and
  2. Find the minimum date from the two max dates all in one step?

在这种情况下,最终结果应该是 2021 年 5 月,并且能够处理多个子产品。

akr*_*run 5

我们可以使用slice_max由“子产品”分组后,pulldate与获得min,将其分配到一个新的对象

library(dplyr)
dfone %>%
    group_by(subproduct) %>%
    slice_max(n = 1, order_by = date) %>%
    ungroup %>%
    pull(date) %>%
    min -> Min_date
Run Code Online (Sandbox Code Playgroud)

-输出

 Min_date
[1] "2021-05-01"
Run Code Online (Sandbox Code Playgroud)

另一种选择是arrange行并filter使用duplicated

dfone %>%
    arrange(subproduct, desc(date)) %>% 
    filter(!duplicated(subproduct)) %>% 
    pull(date) %>%
    min
Run Code Online (Sandbox Code Playgroud)


Tho*_*ing 5

对于您的第一个目标,您可以尝试subset+ave如下所示

out1 <- subset(
    dfone,
    ave(date, subproduct, FUN = max) == date
)
Run Code Online (Sandbox Code Playgroud)

这使

         date subproduct  actuals
29 2021-05-01          1 5.728420
58 2021-09-01          2 3.455491
Run Code Online (Sandbox Code Playgroud)

对于您的第二个目标,基于out1,您可以尝试

out2 <- subset(
    out1,
    date == min(date)
)
Run Code Online (Sandbox Code Playgroud)

这使

         date subproduct  actuals
29 2021-05-01          1 5.083229
Run Code Online (Sandbox Code Playgroud)


Ano*_*n R 5

这也可以在基础 R 中完成。最后我使用了Reduce这样的解决方案,以便可以将解决方案推广到任意数量的subproducts 和dates 而不仅仅是 2 个值,就像这里的情况一样。

Reduce(function(x, y) min(x, y),
       lapply(unique(dfone$subproduct), \(x){
         max(dfone$date[dfone$subproduct == x])
       }))

[1] "2021-05-01"
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你,你真是太好了。是的,诺曼·马特洛夫教授的 R 编程艺术很棒,而且哈德利·威克姆教授的高级 R 至少应该阅读 5 次,您可以在下面的链接中在线阅读,最后在这里尽可能多地尝试尝试和练习,哪里有问题:https://adv-r.hadley.nz/ (2认同)
  • Hadley 的 [R for Data Science](https://r4ds.had.co.nz/) 也是一个好的开始。 (2认同)
  • 还有这个很棒的加上马丁提到的那个:https://rstudio-education.github.io/hopr/ (2认同)