我有一個看起來像這樣的資料框:
library(tidyverse)
library(zoo)
date = c(rep(as.Date("2022/1/1"),5),rep(as.Date("2022/1/12"),5))
a = seq(1,10,1)
b = seq(-1,-10,-1)
c = seq(10,-20,length.out=10)
window=c(rep(2,5),rep(3,5))
A = tibble(date,a,b,c,window);A
date a b c window
<date> <dbl> <dbl> <dbl> <dbl>
1 2022-01-01 1 -1 10 2
2 2022-01-01 2 -2 6.667 2
3 2022-01-01 3 -3 3.333 2
4 2022-01-01 4 -4 0 2
5 2022-01-01 5 -5 -3.333 2
6 2022-01-12 6 -6 -6.667 3
7 2022-01-12 7 -7 -10 3
8 2022-01-12 8 -8 -13.33 3
9 2022-01-12 9 -9 -16.67 3
10 2022-01-12 10 -10 -20 3
我想按日期對列 a、b、c 進行分組,并在所有列 a、b、c 中應用寬度等于該日期的視窗值的滾動視窗,并計算它們的最小值。
例如,對于視窗 2 的日期 2022-01-01,它將在第一行中搜索最小值(將為 -1),然后將向下移動 1,因此將在第一行和第二行中搜索最小值再次為-2,然后進入第二和第三,這將是-3,第三和第四將是-4,然后第四和第五行將是-5,最后第五行將再次是-5。
對于寬度為 3 的日期 2022-01-12 的相同程序,將是 -10、-13、33、-16、67、-20 和 -20。
理想情況下,我希望結果資料框是按日期匯總的所有最小值中的最小值:
| 日期 | 分鐘 |
|---|---|
| 2022-01-01 | -5 |
| 2022-01-12 | -20 |
我認為整個矩陣的rollapply函式可以用by.column = FALSE
所以我嘗試了:
A%>%group_by(date)%>%
summarise(Vectors = rollapply(A[,2:4],width = window,min,by=1,by.column=FALSE))
但它不起作用。
有什么幫助嗎?
uj5u.com熱心網友回復:
要獲得您所說的最終結果,您不妨完全跳過滾動視窗:
A %>%
group_by(date) %>%
summarise(min = min(a, b, c))
#> # A tibble: 2 x 2
#> date min
#> <date> <dbl>
#> 1 2022-01-01 -5
#> 2 2022-01-12 -20
如果您確實想要滾動最小值:您走在正確的軌道上,但您需要使用分組資料(不要A在 內部參考summarise()),并設定alignand partial:
A %>%
group_by(date) %>%
mutate(
min = zoo::rollapply(
cbind(a, b, c),
window,
min,
align = "left",
partial = TRUE,
by.column = FALSE
)
)
#> # A tibble: 10 x 6
#> # Groups: date [2]
#> date a b c window min
#> <date> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 2022-01-01 1 -1 10 2 -2
#> 2 2022-01-01 2 -2 6.67 2 -3
#> 3 2022-01-01 3 -3 3.33 2 -4
#> 4 2022-01-01 4 -4 0 2 -5
#> 5 2022-01-01 5 -5 -3.33 2 -5
#> 6 2022-01-12 6 -6 -6.67 3 -13.3
#> 7 2022-01-12 7 -7 -10 3 -16.7
#> 8 2022-01-12 8 -8 -13.3 3 -20
#> 9 2022-01-12 9 -9 -16.7 3 -20
#> 10 2022-01-12 10 -10 -20 3 -20
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/525509.html
