R中拆分含指标年份的无分隔符列名 将UNCTAD宽数据集转为长格式
解决方案
你可以直接用tidyr包的pivot_longer()函数配合正则表达式一步完成宽表转长表,无需手动拆分每个变量,在你现有代码后追加以下代码即可:
SADC_long <- SADC_DVX_VAexp %>% pivot_longer( cols = -V1, # 保留国家列V1作为标识列,其余所有列参与转换 names_pattern = "^(.*?)(\\d{4})$", # 正则拆分列名:前半部分为指标名,末尾4位为年份 names_to = c(".value", "Year") # .value是特殊关键字,代表把匹配到的指标名作为新列名,第二部分命名为Year列 ) %>% mutate(Year = as.integer(Year)) # 将年份转为整数格式,方便后续分析
代码逻辑说明
- 正则
^(.*?)(\\d{4})$可以完美适配你的列名规则:^匹配列名开头,(.*?)非贪婪匹配提取指标名(DVX/VA_exp/FVA等),(\\d{4})匹配末尾四位年份,$匹配列名结尾 - 无需先转成键值对再手动加宽,一步就能输出你需要的
国家-年份-各指标值结构
如果你处理的数据量较大,想要更高的运行效率,也可以用你已经加载的data.table实现:
setDT(SADC_DVX_VAexp) SADC_long_dt <- melt( SADC_DVX_VAexp, id.vars = "V1", measure = patterns("^DVX", "^VA_exp", "^FVA", "^GVC", "^DVA"), value.name = c("DVX", "VA_exp", "FVA", "GVC", "DVA"), variable.name = "Year" ) # 替换年份编码为实际年份 SADC_long_dt[, Year := 1989 + as.integer(Year)]
内容的提问来源于stack exchange,提问作者Mels
相关产品推荐
相关产品推荐

