You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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单次只能将宽列转换为单个值列,我们可以分两步处理:

  1. 第一步:将年份列转为长格式
    把所有年份相关的列(2007、2021等)转成长表,生成Year和Value列:
df_long <- df %>%
  pivot_longer(
    cols = starts_with("20"), # 匹配所有开头为20的年份列
    names_to = "Year",
    values_to = "Value"
  )

这一步后的数据结构如下:

countryData TypeProductYearValue
AustriaRetail Volumeid12007125
AustriaRetail Volumeid12021140
AustriaRetail Valueid1200715000
AustriaRetail Valueid1202112000
AustriaRetail Volumeid2200775
AustriaRetail Volumeid2202125
  1. 第二步:将Data Type转为宽格式
    用pivot_wider把Data Type的不同类别转成单独的列,正好对应你需要的Retail Volume和Retail Value:
final_df <- df_long %>%
  pivot_wider(
    names_from = `Data Type`,
    values_from = Value
  )

最终得到的结果完全符合目标结构:

countryProductYearRetail VolumeRetail Value
Austriaid1200712515000
Austriaid1202114012000
Austriaid2200775NA
Austriaid2202125NA

注:id2对应的Retail Value为NA,是因为原数据中没有该产品的零售价值数据,属于合理缺失值。

内容的提问来源于stack exchange,提问作者Matteo Bulgarelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 22:22:51