Findtheminimumdatebetweentwomaximumdatesbasedoffuniquevaluesinacolumn
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))
Max Date for Subproduct 1 is May 2021 and max date for Subproduct 2 is Sept 2021.
Question: Is there a way to:
- Find the max date for both unique subproduct and
- Find the minimum date from the two max dates all in one step?
在这种情况下,最终结果应该是 2021 年 5 月,并且能够处理多个子产品。
回答
我们可以使用slice_max由“子产品”分组后,pull将date与获得min,将其分配到一个新的对象
library(dplyr)
dfone %>%
group_by(subproduct) %>%
slice_max(n = 1, order_by = date) %>%
ungroup %>%
pull(date) %>%
min -> Min_date
-输出
Min_date
[1] "2021-05-01"
另一种选择是arrange行并filter使用duplicated
dfone %>%
arrange(subproduct, desc(date)) %>%
filter(!duplicated(subproduct)) %>%
pull(date) %>%
min
回答
对于您的第一个目标,您可以尝试subset+ave如下所示
out1 <- subset(
dfone,
ave(date, subproduct, FUN = max) == date
)
这使
date subproduct actuals
29 2021-05-01 1 5.728420
58 2021-09-01 2 3.455491
对于您的第二个目标,基于out1,您可以尝试
out2 <- subset(
out1,
date == min(date)
)
这使
date subproduct actuals
29 2021-05-01 1 5.083229
回答
这也可以在基础 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"
- 谢谢你,你真是太好了。是的,诺曼·马特洛夫教授的 R 编程艺术很棒,而且哈德利·威克姆教授的高级 R 至少应该阅读 5 次,您可以在下面的链接中在线阅读,最后在这里尽可能多地尝试尝试和练习,哪里有问题:https://adv-r.hadley.nz/
- Hadley 的 [R for Data Science](https://r4ds.had.co.nz/) 也是一个好的开始。
- 还有这个很棒的加上马丁提到的那个:https://rstudio-education.github.io/hopr/
THE END
二维码