如何用R的pivot_longer()将多变量宽格式数据框转为长格式
使用pivot_longer()转换多轮调查宽格式数据为长格式
先加载tidyverse包(pivot_longer属于tidyr模块,包含在tidyverse集合里),直接运行以下代码就能得到你要的长格式数据:
library(tidyverse) # 转换长格式并调整列名 df_long <- df %>% pivot_longer( cols = -c(id, country, gender), # 保留这三列不参与转换 names_to = c(".value", "wave"), # .value对应原变量名,wave存储轮次标识 names_pattern = "(.*)_w(\\d)" # 用正则拆分列名:捕获变量名和轮次数字 ) %>% rename(year = int_year, age = age_int) %>% # 调整列名匹配目标格式 mutate(wave = paste0("w", wave)) # 把轮次数字转为w1/w2/w3格式
运行后输出的df_long和你给出的目标格式完全一致:
df_long #> id country gender wave interview year age #> <dbl> <chr> <dbl> <chr> <dbl> <dbl> <dbl> #> 1 1 UK 1 w1 1 2007 60 #> 2 1 UK 1 w2 2 2010 63 #> 3 1 UK 1 w3 1 2012 65 #> 4 2 Spain 1 w1 2 2008 40 #> 5 2 Spain 1 w2 2 2009 41 #> 6 2 Spain 1 w3 1 2012 44 #> 7 3 Sweden 2 w1 2 2007 50 #> 8 3 Sweden 2 w2 2 2010 53 #> 9 3 Sweden 2 w3 1 2013 56
核心参数说明
- names_to:用
c(".value", "wave")是关键,其中.value是特殊占位符,意思是“把拆分出的第一部分作为新列名保留”(比如原列名里的interview、int_year会成为新数据列);wave则是专门存储轮次标识的列名。 - names_pattern:正则表达式
(.*)_w(\\d)用来拆分原列名:(.*):捕获下划线前的所有字符,对应变量名部分(如interview)_w:匹配列名里固定的分隔符(\\d):捕获下划线后的数字,对应轮次的1/2/3,后续通过paste0转为w1/w2/w3格式
内容的提问来源于stack exchange,提问作者saif
相关产品推荐
相关产品推荐

