r - 通过 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 (价值)))
解决方案
这是一种潜在的方法:
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
一些备注
- OP 已要求该季度应由 class 的对象表示
Date
。此外,OP 已要求将第一季度的日期与 3 月 1 日对齐。因此,数据按每个季度的第一天加上 2 个月进行分组。 GeoUID
也被认为是一个分组变量。否则,它不得出现在最终结果中。- 对于计算
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
推荐阅读
- android - 如何在android studio中删除应用程序图标中的黑色背景?
- python - Python如何使用多个可接受的选项验证用户输入
- c++11 - 从向量位置获取数值
- android - 使用 Volley Json Mysql 自动刷新带有图像和文本的 ListView
- javascript - 我试图提醒“70”和“John”,但我收到了一个提醒“[object Object]”
- javascript - 如何始终保持 Plotlly.js 中的峰值或以编程方式触发它们?
- .htaccess - 如何将字符串添加到 htaccess 中的 url
- c# - 从 64 位应用程序调用 32 位 DLL 的函数
- python - python并附加到JSON文件
- delphi - 级联删除EntityDAC中的一对一链接实体