如何使用R或Stata将含多维度字符串列名的宽格式数据转换为长格式?
解决方案:宽格式转长格式(拆分列名多维度)
我来帮你搞定这个宽转长的需求,不管用R还是Stata都有高效的解决方案,完全能适配你几千列的大规模数据:
R 实现(基于tidyverse工具链)
tidyverse里的tidyr包专门处理这类数据格式转换,对大规模数据的支持也很好,步骤清晰易维护:
首先加载必备的包,构造示例测试数据:
library(tidyverse) # 构造你的示例数据 df <- tibble( cou = c("AUS", "AUS"), own = c("D", "D"), ind = c("A", "B"), aus_d_a = c(3268.02, 92.1329), usa_f_b = c(85.087, 10808.3) )
然后执行转换操作:
long_df <- df %>% # 把所有非标识列(cou/own/ind)转成长格式,列名存到category,对应值存到value pivot_longer( cols = -c(cou, own, ind), # 直接排除标识列,自动选中所有需要转换的列(适合几千列的场景) names_to = "category", values_to = "value" ) %>% # 拆分category列到cou2/own2/ind2,下划线作为分隔符 separate( col = category, into = c("cou2", "own2", "ind2"), sep = "_" ) %>% # 把拆分后的列转成小写,和你的示例格式匹配 mutate( across(c(cou2, own2, ind2), str_to_lower) ) %>% # 调整列顺序,和目标表格B一致 select(cou, own, ind, cou2, own2, ind2, value)
注:如果你的列名有更复杂的规则(比如行业是多字符如c21),
separate命令会自动识别下划线分隔的三个部分,完全适配你的60国+2所有权+34行业的列名结构。
Stata 实现
Stata的reshape命令是处理宽长转换的利器,配合字符串拆分命令,几步就能完成:
先构造示例测试数据:
clear input str3 cou str1 own str1 ind float aus_d_a double usa_f_b AUS D A 3268.02 85.087 AUS D B 92.1329 10808.3 end
然后执行转换:
// 1. 宽转长:以cou/own/ind为标识列,把所有列名存到category变量 reshape long , i(cou own ind) j(category) string // 2. 拆分category变量为三个维度,下划线作为分隔符 split category, p("_") rename category1 cou2 rename category2 own2 rename category3 ind2 drop category // 3. 把拆分后的列转成小写 replace cou2 = lower(cou2) replace own2 = lower(own2) replace ind2 = lower(ind2) // 4. 调整列顺序并重命名值列,匹配目标表格B order cou own ind cou2 own2 ind2 _j rename _j value
注:
reshape long命令会自动识别所有符合格式的列,哪怕你有几千列,也能一次性完成转换,效率很高。
内容的提问来源于stack exchange,提问作者Tao Zhang
相关产品推荐
相关产品推荐

