在R中批量将相似命名列转换为长格式的方法求助
解决R中pivot_longer转换长格式时出现大量NA的问题
你的问题出在names_sep="_"的分割逻辑上:它会按第一个下划线拆分列名,要是你的列前缀里本身包含下划线(比如存在Teacher_Exp_2019这类列名),拆分后年份部分会变成Exp_2019,导致无法和其他同年份的列匹配,最终生成大量NA。
正确的做法是用正则表达式精准匹配年份部分,不管前缀里有多少个下划线,只提取最后一个下划线后的四位数字作为年份。代码如下:
library(tidyverse) data <- read.csv("https://raw.githubusercontent.com/ilzl/i/master/prac.csv") %>% pivot_longer( cols = -id, names_to = c(".value", "year"), # 正则规则:捕获下划线前的所有内容作为列前缀,下划线后四位数字作为年份 names_pattern = "(.*)_(\\d{4})" ) %>% # 把year从字符转成数值型 mutate(year = as.numeric(year))
关键说明
names_pattern = "(.*)_(\\d{4})":(.*):匹配并捕获下划线前的所有内容,对应.value(也就是保留的原列前缀,比如ratio、EL、Teacher)(\\d{4}):匹配并捕获四位数字,对应year列,确保只提取2019、2020这类年份值
- 最后用
mutate把year转成数值型,方便后续按年份做分析
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

