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

使用dplyr将R语言宽数据转换为长数据并添加周次变量

解决方案:用dplyr+tidyr实现宽表转长表

直接使用tidyr::pivot_longer函数可以一次性完成宽格式到长格式的转换,同时提取周数、匹配对应列值,代码如下:

library(dplyr)
library(tidyr)

# 假设你的原始数据框名为df
long_format_df <- df %>%
  pivot_longer(
    cols = -ID,  # 排除ID列,转换其余所有列
    names_to = c(".value", "WEEK"),  # .value保留列名前缀作为新列名,WEEK存储提取的周数
    names_pattern = "(AI_|activity)(\\d+)",  # 正则匹配列名的前缀和数字部分
    convert = TRUE  # 自动把WEEK的字符类型转为数值类型
  ) %>%
  rename(AI = AI_)  # 将AI_列重命名为AI,符合需求

代码解释

  • cols = -ID:明确只转换除ID之外的列,保留ID作为分组标识
  • names_to = c(".value", "WEEK"):.value是特殊参数,代表将列名中匹配的前缀部分作为新列的名称;WEEK用来存储从列名中提取的数字(1-7)
  • names_pattern:正则表达式(AI_|activity)(\\d+)将列名拆分为两部分:第一部分是AI_或activity(对应新列的名称),第二部分是周数数字
  • convert = TRUE:自动将WEEK列从字符型转为数值型,避免后续分析时类型问题
  • rename(AI = AI_):修正列名,把正则提取得到的AI_改为需求中的AI

结果示例

转换后的数据结构会符合你的预期,示例如下:

IDWEEKAIactivity
1110walk
1212sit
............
2720sleep

常见错误排查

如果你的原有代码运行失败,大概率是以下原因:

  • 未使用pivot_longer处理成对列,而是用gather分别转换AI和activity列,导致无法对应周数
  • 正则表达式写法错误,无法正确提取列名中的前缀和周数
  • 未设置.value参数,导致列名和值无法正确匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:35:37