You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:25:12