R语言使用pivot_longer拆分列名实现数据透视的问题求解
解决方案
问题原因
原代码运行结果不符合预期,核心是两个疏漏:
- 原始数据集没有行唯一标识,
pivot_longer做透视转换时无法识别值对应的原始行归属,会导致数值错误折叠、错位 - 手动枚举所有列名、手写正则匹配分隔符的写法冗余,容易引入拼写错误
可直接运行的修正代码
library(tidyr) library(dplyr) # 原始数据集构造 df<-data.frame( 'Company with premium status-Land' = c(5,1), 'Company with premium status-Sea' = c(5,1), 'Company with premium status-Air' = c(5,1), 'Company with premium status-Unkown' = c(5,1), 'Company with premium status-Total' = c(5,1), 'Company with low class status-Land' = c(10,1), 'Company with low class status-Sea' = c(10,1), 'Company with low class status-Air' = c(10,1), 'Company with low class status-Unkown' = c(10,1), 'Company with low class status-Total' = c(10,1), check.names = FALSE ) df1 <- df %>% # 新增行ID列,标记原始数据的行对应关系 mutate(row_no = row_number()) %>% pivot_longer( cols = -row_no, names_to = c("company_type", ".value"), names_sep = "-", ) print(df1)
输出结构说明
运行后得到的结果完全匹配需求:
- 每行对应一个公司类型+原始行的组合,共4行记录
company_type列存储原列名中-前的公司等级分类,包含Company with premium status、Company with low class status两个取值Land/Sea/Air/Unkown/Total列存储原列名中-后维度对应的数值,和原始数据完全一致
注:如果不需要保留原始行标记,可以在透视完成后用
select(-row_no)移除该列。
内容的提问来源于stack exchange,提问作者silent_hunter
相关产品推荐
相关产品推荐

