R- 选择季度月份值

问题描述 投票:0回答:1

从给定的数据帧中,我试图提取

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
r lubridate data-wrangling mutate
1个回答
1
投票

按季度分组,然后通过将每个季度的第一行设置为等于该季度最后一个月的值来生成

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
© www.soinside.com 2019 - 2024. All rights reserved.