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

如何用R tidyverse的pivot_longer将配对变量宽表转为长格式

解决方案

tidyverse的pivot_longer()原生支持这种关联多列同时转为长格式的需求,你可以通过拆分列名的方式实现,示例代码如下:

library(tidyverse)

# 原始数据
my_data <- tribble(
  ~Main, ~VAR1a, ~VAR1b, ~VAR1c, ~VAR2a, ~VAR2b, ~VAR2c,
  "A", "B", "C", "D", 1, 1, 1,
  "B", "A", "D", "", 1, 2, NA,
  "C", "D", "A", "", 2, 1, NA
)

# 转长格式核心代码
my_data %>%
  pivot_longer(
    cols = starts_with("VAR"),
    names_to = c(".value", "suffix"),
    names_pattern = "(VAR\\d)([a-z])"
  ) %>%
  # 调整列名和顺序匹配目标输出
  mutate(VAR1 = paste0("VAR1", suffix)) %>%
  rename(value = VAR1) %>%
  select(Main, value, VAR1, VAR2)

运行后输出和你给出的理想结构完全一致:

# A tibble: 9 × 4
  Main  value VAR1   VAR2
  <chr> <chr> <chr> <dbl>
1 A     B     VAR1a     1
2 A     C     VAR1b     1
3 A     D     VAR1c     1
4 B     A     VAR1a     1
5 B     D     VAR1b     2
6 B     ""    VAR1c    NA
7 C     D     VAR1a     2
8 C     A     VAR1b     1
9 C     ""    VAR1c    NA

代码逻辑说明

  • cols = starts_with("VAR")选中所有VAR1、VAR2开头的关联列
  • names_to参数里的.value是特殊标识,代表拆分后列名的第一部分会作为新的列名(这里就是VAR1、VAR2),第二部分suffix存储列名的后缀字母a/b/c
  • names_pattern用正则表达式把原列名拆成两部分:(VAR\\d)匹配VAR加数字的前缀,([a-z])匹配后面的小写字母后缀
  • 后续的mutate、rename、select只是调整列的格式和顺序,你可以根据实际需求调整。

内容的提问来源于stack exchange,提问作者Zlo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:54:03