如何将R数据框中多组同名前缀变量转换为长格式?
R数据框按列前缀分组重塑(宽转长)
你可以用tidyverse工具集里的tidyr包来实现这个格式转换,核心思路是先把宽表转成长表拆分列名,再转回宽表重组结构。以下是完整实现代码和步骤说明:
代码实现
library(tidyverse) # 示例数据 DATA <- read.table(header=T, text= "InstNm OTE_CPct OTE_L OTE_P OTE_R RAE_EPct RAE_NPct RAE_L RAE_B RAE_P RAE_R Baker 60 1 1 Limited 56 76 1 0 1 Limited") # 执行重塑 result <- DATA %>% # 把所有带前缀的列转为长格式,提取列名和对应值 pivot_longer(cols = -InstNm, names_to = "key", values_to = "value") %>% # 拆分列名为"Indicator(前缀)"和"Metric(指标名)"两部分 separate(key, into = c("Indicator", "Metric"), sep = "_") %>% # 把指标名转回列,对应填充值 pivot_wider(names_from = Metric, values_from = value) %>% # 把原R列重命名为Rating,匹配目标格式 rename(Rating = R) %>% # 调整列顺序,和目标输出一致 select(InstNm, Indicator, Rating, CPct, NPct, EPct, L, P, B) # 查看结果 print(result)
步骤说明
pivot_longer转长表:将除InstNm外的所有列压缩成key(原列名)和value(对应数值)两列,为拆分前缀做准备。separate拆分列名:按下划线_把key列拆成Indicator(如OTE/RAE)和Metric(如CPct/L/R),区分分组标识和具体指标。pivot_wider转回宽表:将Metric列的不同值转为新列,用value填充对应内容,缺失的指标自动补NA。- 重命名与列序调整:把原
R列改名为Rating,再调整列的顺序完全匹配目标输出格式。
验证结果
可以用以下代码验证转换后的数据是否和目标一致:
Desired_output <- read.table(header=T, text= "InstNm Indicator Rating CPct NPct EPct L P B Baker OTE Limited 60 NA NA 1 1 NA Baker RAE Limited NA 76 56 1 1 0") # 忽略属性检查,只比较数据内容 all.equal(result, Desired_output, check.attributes = FALSE) # 输出TRUE表示转换正确
这个方法是通用的——哪怕你有更多前缀的列组(比如XXX_、YYY_开头),代码不需要修改就能自动处理所有分组。
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

