如何用pivot_longer()实现多values_to的长表重塑?
解决方案:结合
pivot_longer()和pivot_wider()实现目标格式 首先构造模拟你的输入数据:
library(tidyverse) df <- tibble( country = c("Austria", "Austria", "Austria"), `Data Type` = c("Retail Volume", "Retail Value", "Retail Volume"), Product = c("id1", "id1", "id2"), `2007` = c(125, 15000, 75), `2021` = c(140, 12000, 25) )
你遇到的values_to必须为一维的限制,是因为pivot_longer单次只能将宽列转换为单个值列,我们可以分两步处理:
- 第一步:将年份列转为长格式
把所有年份相关的列(2007、2021等)转成长表,生成Year和Value列:
df_long <- df %>% pivot_longer( cols = starts_with("20"), # 匹配所有开头为20的年份列 names_to = "Year", values_to = "Value" )
这一步后的数据结构如下:
| country | Data Type | Product | Year | Value |
|---|---|---|---|---|
| Austria | Retail Volume | id1 | 2007 | 125 |
| Austria | Retail Volume | id1 | 2021 | 140 |
| Austria | Retail Value | id1 | 2007 | 15000 |
| Austria | Retail Value | id1 | 2021 | 12000 |
| Austria | Retail Volume | id2 | 2007 | 75 |
| Austria | Retail Volume | id2 | 2021 | 25 |
- 第二步:将
Data Type转为宽格式
用pivot_wider把Data Type的不同类别转成单独的列,正好对应你需要的Retail Volume和Retail Value:
final_df <- df_long %>% pivot_wider( names_from = `Data Type`, values_from = Value )
最终得到的结果完全符合目标结构:
| country | Product | Year | Retail Volume | Retail Value |
|---|---|---|---|---|
| Austria | id1 | 2007 | 125 | 15000 |
| Austria | id1 | 2021 | 140 | 12000 |
| Austria | id2 | 2007 | 75 | NA |
| Austria | id2 | 2021 | 25 | NA |
注:id2对应的Retail Value为NA,是因为原数据中没有该产品的零售价值数据,属于合理缺失值。
内容的提问来源于stack exchange,提问作者Matteo Bulgarelli
相关产品推荐
相关产品推荐

