如何用pivot_longer将宽表转为多值长表并提取年份
宽表转长表的正确实现方法
原始宽表数据
states <- tibble( state = c("Idaho","Illinois","Indiana"), statefip = 16:18, da2012 = 0, da2013 = 0, da2014 = c(1, 0, 0), daes2012 = c(-4, 0, 0), daes2013 = c(-3, 0, 0), daes2014 = c(-2, 0, 0), rural_pct = c(0.29421874, 0.11512130, 0.27556394) )
需求说明
需要将上述宽表转换为包含state、statefip、year、da、daes、rural_pct列的长表,每行对应一个州的单一年度数据。
原代码问题分析
你之前的pivot_longer写法有误:直接指定names_to = "year"无法区分da和daes前缀,也没法从列名里提取年份;同时values_to传入向量的方式需要配合正则匹配规则,否则不能正确把值映射到da和daes列。
正确实现代码
用pivot_longer结合正则表达式匹配列名里的前缀和年份,就能完成转换:
library(tidyverse) states_long <- states %>% pivot_longer( cols = starts_with("da"), # 选中所有以da开头的列 names_to = c(".value", "year"), # .value用匹配到的前缀作为新列名,year提取年份 names_pattern = "(da.*?)(\\d{4})" # 正则分组:第一组匹配da/daes前缀,第二组匹配4位年份 )
代码解释
names_pattern = "(da.*?)(\\d{4})":正则分两组,第一组(da.*?)非贪婪匹配da或daes前缀,第二组(\\d{4})匹配4位数字的年份;names_to = c(".value", "year"):第一组匹配结果对应da和daes列的值,第二组结果作为year列的内容;- 执行后会自动保留
state、statefip、rural_pct这些非透视列,最终得到符合需求的长表。
内容的提问来源于stack exchange,提问作者rjblake34
相关产品推荐
相关产品推荐

