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

在R中使用pivot_longer()转换长格式以生成多值列

宽格式转长格式(hrar/pai组对应)的pivot_longer解决方案

先模拟你的数据场景

假设你的数据框包含个体ID和多组hrar/pai列,先构造示例数据方便演示:

# 模拟宽格式数据(替换成你从CSV读取的data.frame即可)
df <- data.frame(
  id = 1:3,  # 个体唯一标识,建议保留用于区分不同个体
  hrar1 = c(60, 70, 80),
  hrar2 = c(62, 72, 82),
  hrar3 = c(65, 75, 85),
  pai1 = c(100, 120, 140),
  pai2 = c(105, 125, 145),
  pai3 = c(110, 130, 150)
)

核心转换代码

使用tidyr::pivot_longer,关键是通过正则匹配列名的前缀(hrar/pai)和数字后缀,实现同组观测对齐:

library(tidyr)

# 转换为长格式
df_long <- df %>%
  pivot_longer(
    cols = -id,  # 排除个体ID列,其余列参与转换;若无ID可写cols = starts_with(c("hrar", "pai"))
    names_to = c(".value", "time"),  # .value保留前缀为列名,time存储观测次数(1/2/3)
    names_pattern = "(hrar|pai)(\\d+)"  # 正则捕获:第一个组匹配前缀,第二个组匹配数字
  )

转换后结果说明

最终会得到每行对应一个个体的一次hrar/pai观测:

# A tibble: 9 × 3
     id time  hrar   pai
  <int> <chr> <dbl> <dbl>
1     1 1        60   100
2     1 2        62   105
3     1 3        65   110
4     2 1        70   120
5     2 2        72   125
6     2 3        75   130
7     3 1        80   140
8     3 2        82   145
9     3 3        85   150

常见错误排查

  • 报错找不到.value:检查tidyr版本,确保是1.0.0及以上版本(可通过packageVersion("tidyr")查看,旧版本需更新)
  • 列名格式不匹配:如果你的列名是hrar_1/pai_2这种带下划线的,把names_pattern改成"(hrar|pai)_(\\d+)"
  • 丢失个体信息:如果原始数据没有个体ID列,先添加:df$id <- 1:nrow(df),避免转换后无法区分不同个体的观测

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:35:43