从给定的数据帧中,我试图提取
quarterly_values
,但是当我尝试每三个月改变一次值时,它会失败。
mont_dates <- c("201401", "201402", "201403", "201404", "201405",
"201406", "201407", "201408", "201409", "201410", "201411", "201412")
cat <- c("new", "old", "undefined", "new", "old", "undefined",
"undefined", "new", "old", "undefined", "new", "old")
mont_vals <- c(221, 433, 878, 455, 998, 797, 77, 3435, 868, 686, 868, 434)
ID <- c(1,2,3,4,5,6,7,8,9,10,11,12)
df <- data.frame(mont_dates, mont_vals, cat, ID)
提取每月值并计算季度值的功能
Monthly_Qrt_vals <- function(df1) {
df1 %>%
mutate(mont_dates = ymd(paste0(mont_dates, "01")),
quarter = paste0(year(mont_dates), " Q", quarter(mont_dates))) %>%
arrange(mont_dates) %>%
mutate(quarterly_values = mont_vals[c(1,seq(3, nrow(mont_vals) , by=3)),])
}
result <- df %>% Monthly_Qrt_vals()
View(result)
cat ID mont_dates mont_vals quarter
1 new 1 2014-01-01 221 2014 Q1
2 old 2 2014-02-01 433 2014 Q1
3 undefined 3 2014-03-01 878 2014 Q1
4 new 4 2014-04-01 455 2014 Q2
5 old 5 2014-05-01 998 2014 Q2
6 undefined 6 2014-06-01 797 2014 Q2
7 undefined 7 2014-07-01 77 2014 Q3
8 new 8 2014-08-01 3435 2014 Q3
9 old 9 2014-09-01 868 2014 Q3
10 undefined 10 2014-10-01 686 2014 Q4
11 new 11 2014-11-01 868 2014 Q4
12 old 12 2014-12-01 434 2014 Q4
错误
Error in `mutate()`:
ℹ In argument: `quarterly_values = mont_vals[c(1, seq(3, nrow(mont_vals), by = 3)), ]`.
Caused by error in `seq.default()`:
! 'to' must be of length 1
预期结果
quarterly_values
应将每三个月的值分配给季度的第一行,即 2014 Q1, 2014 Q2
。
原始数据集是从
2014-2023
开始 10 年的数据集 是否有替代解决方案来获取 quarterly_values
?
cat ID mont_dates mont_vals quarter quarterly_values
1 new 1 2014-01-01 221 2014 Q1 878
2 old 2 2014-02-01 433 2014 Q1 NA
3 undefined 3 2014-03-01 878 2014 Q1 NA
4 new 4 2014-04-01 455 2014 Q2 797
5 old 5 2014-05-01 998 2014 Q2 NA
6 undefined 6 2014-06-01 797 2014 Q2 NA
7 undefined 7 2014-07-01 77 2014 Q3 868
8 new 8 2014-08-01 3435 2014 Q3 NA
9 old 9 2014-09-01 868 2014 Q3 NA
10 undefined 10 2014-10-01 686 2014 Q4 434
11 new 11 2014-11-01 868 2014 Q4 NA
12 old 12 2014-12-01 434 2014 Q4 NA
按季度分组,然后通过将每个季度的第一行设置为等于该季度最后一个月的值来生成
quarterly_values
。它使用 ifelse
来决定是否填充行,并使用 tail
来选择每组(季度)内的最终值。
df |>
mutate(mont_dates = ymd(paste0(mont_dates, "01")),
quarter = paste0(year(mont_dates), " Q", quarter(mont_dates))) |>
group_by(quarter) |>
mutate(quarterly_values=ifelse(row_number()==1 , tail(mont_vals,1) , NA))
# A tibble: 12 × 6
# Groups: quarter [4]
mont_dates mont_vals cat ID quarter quarterly_values
<date> <dbl> <chr> <dbl> <chr> <dbl>
1 2014-01-01 221 new 1 2014 Q1 878
2 2014-02-01 433 old 2 2014 Q1 NA
3 2014-03-01 878 undefined 3 2014 Q1 NA
4 2014-04-01 455 new 4 2014 Q2 797
5 2014-05-01 998 old 5 2014 Q2 NA
6 2014-06-01 797 undefined 6 2014 Q2 NA
7 2014-07-01 77 undefined 7 2014 Q3 868
8 2014-08-01 3435 new 8 2014 Q3 NA
9 2014-09-01 868 old 9 2014 Q3 NA
10 2014-10-01 686 undefined 10 2014 Q4 434
11 2014-11-01 868 new 11 2014 Q4 NA
12 2014-12-01 434 old 12 2014 Q4 NA