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:
在这种情况下,最终结果应该是 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
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)
对于您的第一个目标,您可以尝试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)
这也可以在基础 R 中完成。最后我使用了Reduce
这样的解决方案,以便可以将解决方案推广到任意数量的subproduct
s 和date
s 而不仅仅是 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)
归档时间: |
|
查看次数: |
95 次 |
最近记录: |