首页 > 解决方案 > 通过 R 中的唯一列值将月度数据转换为季度

问题描述

这是我的数据框 LFS 列下有 3 类数据:失业和劳动力 不同 NAICS 的数据也不同。

对于每个 NAICS,我需要通过 NAICS 将每个(失业、劳动力)的月度数据转换为季度数据(平均 3 个月数据),数据框中还有其他列,例如 GeoUID 不需要聚合。只需要聚合 VALUE 列。

季度数据表创建后,可以显示为2015-03-01,而不是Q1-yyyy格式。然后可以计算称为 UR 的第三个数据(失业率 = 失业率除以劳动力)。

现在,我通过 LFS 导出子集表来做到这一点,但应该有更有效的方法吗?

日期 GeoUID 行业 LFS 价值
2015-01-01 35 农业 失业 200
2015-02-01 35 农业 失业 200
2015-03-01 35 农业 失业 200
2015-01-01 35 农业 劳动力 500
2015-02-01 35 农业 劳动力 500
2015-03-01 35 农业 劳动力 500
2015-01-01 35 建造 失业 300
2015-02-01 35 建造 失业 300
2015-03-01 35 建造 失业 300
2015-01-01 35 建造 劳动力 800
2015-02-01 35 建造 劳动力 800
2015-03-01 35 建造 劳动力 800

我的结果新表应该是这样的

日期 GeoUID 行业 LFS 价值
2015-03-01 35 农业 失业 200
2015-03-01 35 农业 劳动力 500
2015-03-01 35 农业 失业率 0.4
2015-03-01 35 建造 失业 300
2015-03-01 35 建造 劳动力 800
2015-03-01 35 建造 失业率 0.375

顺便说一句,这是我的代码,它也不起作用... (newdf<-unemp%>%
group_by(Industry, Quarter = Quarters(REF_DATE), year = lubridate::year(REF_DATE)) %>%
summarise(mean_var = mean (价值)))

标签: r

解决方案


这是一种潜在的方法:

library(dplyr)
library(tidyr)
newdf <- unemp %>%
  group_by(DATE = lubridate::floor_date(DATE, "quarter") + months(2),
           GeoUID,
           Industry,
           LFS) %>%
  summarise(VALUE = mean(VALUE)) %>% 
  pivot_wider(names_from = LFS, values_from = VALUE) %>% 
  mutate("Unemployment rate" = Unemployment / `Labour force`) %>% 
  pivot_longer(`Labour force`:`Unemployment rate`)
newdf
# A tibble: 6 x 5
# Groups:   DATE, GeoUID, Industry [2]
  DATE       GeoUID Industry     name                value
  <date>      <dbl> <chr>        <chr>               <dbl>
1 2015-03-01     35 Agriculture  Labour force      500    
2 2015-03-01     35 Agriculture  Unemployment      200    
3 2015-03-01     35 Agriculture  Unemployment rate   0.4  
4 2015-03-01     35 Construction Labour force      800    
5 2015-03-01     35 Construction Unemployment      300    
6 2015-03-01     35 Construction Unemployment rate   0.375

一些备注

  1. OP 已要求该季度应由 class 的对象表示Date。此外,OP 已要求将第一季度的日期与 3 月 1 日对齐。因此,数据按每个季度的第一天加上 2 个月进行分组。
  2. GeoUID也被认为是一个分组变量。否则,它不得出现在最终结果中。
  3. 对于计算 Unemployment rate,数据正在前后重塑。据推测,还有其他更有效的方法不需要重新塑造数据。

编辑:没有重塑的版本

library(dplyr)
df_quarter <- unemp %>%
  group_by(DATE = lubridate::floor_date(DATE, "quarter") + months(2),
           GeoUID,
           Industry,
           LFS) %>%
  summarise(VALUE = mean(VALUE))
newdf <- bind_rows(
  df_quarter,  
  df_quarter %>% 
    summarise(VALUE = VALUE[LFS == "Unemployment"] / VALUE[LFS == "Labour force"], 
              LFS = "Unemployment rate")
) %>% 
  arrange(DATE, GeoUID, Industry)
newdf
# A tibble: 6 x 5
# Groups:   DATE, GeoUID, Industry [2]
  DATE       GeoUID Industry     LFS                 VALUE
  <date>      <dbl> <chr>        <chr>               <dbl>
1 2015-03-01     35 Agriculture  Labour force      500    
2 2015-03-01     35 Agriculture  Unemployment      200    
3 2015-03-01     35 Agriculture  Unemployment rate   0.4  
4 2015-03-01     35 Construction Labour force      800    
5 2015-03-01     35 Construction Unemployment      300    
6 2015-03-01     35 Construction Unemployment rate   0.375

推荐阅读