如何在R中透视成对列?使用names_pattern参数实现宽表转长表
解决方法
你可以直接用tidyr::pivot_longer()搭配正确的names_pattern正则表达式实现需求,核心是通过两个捕获组分别提取问题编号和指标类型,配合.value参数自动生成新列:
# 加载所需包 library(tidyr) library(dplyr) # 数据转换 res <- dat %>% pivot_longer( cols = everything(), # 转换所有列 # 正则捕获两组内容:第一组是Q8_数字,第二组是下划线后的指标名 names_pattern = "^(Q8_\\d)_(.*)$", # 第一组存为Question列,第二组作为新的列名取对应值 names_to = c("Question", ".value") ) %>% # 按需求保留两位小数,对齐预期输出 mutate( Weighted_Average = round(avg, 2), Weighted_SE = round(avg_se, 2), Unweighted_Average = round(unweighted, 2) ) %>% # 筛选保留需要的列 select(Question, Weighted_Average, Weighted_SE, Unweighted_Average)
运行后得到的res和你期望的输出结构完全一致。
内容的提问来源于stack exchange,提问作者spindoctor
相关产品推荐
相关产品推荐

