如何用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
相关产品推荐
相关产品推荐

