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

如何用pivot_longer处理多模式列并生成visit_no计数列?

宽格式转长格式并生成访问次数标记

解决方案(R语言,tidyr包)

使用tidyr::pivot_longer函数,通过正则表达式匹配列名前缀和访问次数后缀,精准转换格式:

1. 准备示例数据

library(tidyr)

# 构造你的宽格式数据集
wide_data <- data.frame(
  idno = c(20, 21, 22),
  sex = c("M", "F", "M"),
  age_1 = c(10, 11, 12),
  date_visit_1 = c("10/1/2010", "10/2/2010", "11/3/2010"),
  height_in_cm_1 = c(100, 90, 100),
  age_2 = c(11, 12, 13),
  date_visit_2 = c("10/1/2011", "11/3/2011", "12/4/2011"),
  height_in_cm_2 = c(110, 100, 105),
  age_3 = c(12, 13, 14),
  date_visit_3 = c("10/2/2012", "12/5/2012", "12/5/2012"),
  height_in_cm_3 = c(115, 105, 110)
)

2. 执行格式转换

long_data <- wide_data %>%
  pivot_longer(
    cols = starts_with(c("age_", "date_visit_", "height_in_cm_")), # 选中所有带数字后缀的目标列
    names_pattern = "(.*)_(\\d+)", # 正则捕获:(列名前缀)_(访问次数)
    names_to = c(".value", "visit_no"), # .value将前缀作为新列名,第二个捕获组作为visit_no
    values_drop_na = TRUE # 可选:自动剔除缺失值行
  )

3. 转换后结果

执行后得到的long_data完全符合你期望的长格式:

idno sex   age date_visit height_in_cm visit_no
1   20 M    10  10/1/2010  100          1       
2   20 M    11  10/1/2011  110          2       
3   20 M    12  10/2/2012  115          3       
4   21 F    11  10/2/2010   90          1       
5   21 F    12  11/3/2011  100          2       
6   21 F    13  12/5/2012  105          3       
7   22 M    12  11/3/2010  100          1       
8   22 M    13  12/4/2011  105          2       
9   22 M    14  12/5/2012  110          3       

关键参数说明

  • names_pattern = "(.*)_(\\d+)":正则表达式精准拆分列名,(.*)捕获下划线前的列名前缀(如age、date_visit),(\\d+)捕获下划线后的数字(访问次数)。
  • names_to = c(".value", "visit_no"):.value是特殊关键字,告诉函数将相同前缀的列合并为一个值列;第二个元素visit_no指定数字后缀对应的新列名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:21:02