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

如何用dplyr的pivot_wider转换特殊结构的DataFrame?

解决方法

不需要先pivot_wider再pivot_longer,核心是先拆分metric列,区分基础指标和上下限类型,再一次性转成目标宽格式。

步骤1:加载数据

library(tidyverse)

df <- tibble(metric = c('income', 'income_upp', 'income_low', 'n_house', 'n_house_upp', 'n_house_low'),
       value = c(120, 140, 100, 10, 8, 12))

步骤2:拆分指标列并转宽

通过字符串处理提取基础指标名称,同时标记该值是主值、下限还是上限,再用pivot_wider重组:

df_processed <- df %>%
  mutate(
    # 提取基础指标名:移除末尾的_upp或_low后缀
    base_metric = str_remove(metric, '_upp$|_low$'),
    # 标记值的类型:主值/下限/上限
    value_type = case_when(
      str_detect(metric, '_upp$') ~ 'value_upp',
      str_detect(metric, '_low$') ~ 'value_low',
      TRUE ~ 'value'
    )
  ) %>%
  pivot_wider(
    id_cols = base_metric,
    names_from = value_type,
    values_from = value
  ) %>%
  rename(metric = base_metric) # 把基础指标列名改回metric

输出结果

print(df_processed)
#> # A tibble: 2 × 4
#>   metric   value value_low value_upp
#>   <chr>    <dbl>     <dbl>     <dbl>
#> 1 income     120       100       140
#> 2 n_house     10         8        12

思路说明

直接pivot_wider会把每个metric值都转成单独列,原因是没有区分基础指标和上下限的关联关系。通过拆分metric列,把同一基础指标的主值、上下限归为一组,再转宽就能得到清晰的目标结构。

内容的提问来源于stack exchange,提问作者Juan C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 22:35:18