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

R语言:如何为无时间变量的宽格式数据集创建时间变量并转长格式?

解决方案:宽格式转长格式并创建时间变量

你可以用两种常用方法实现宽转长并生成时间变量,以下是具体代码和说明:

方法1:使用tidyverse的pivot_longer(推荐)

pivot_longer 是tidyverse工具集里处理宽长格式转换的灵活函数,适合这类带后缀时间标记的数据集:

library(tidyverse)

# 构建原始数据集
id <- c(1,2,3)
pdq1 <- c(3,5,6)
pdq2 <- c(1,3,4)
pdq3 <- c(4,5,4)
scor_abp1 <- c(1,2,3)
scor_abp2 <- c(2,2,4)
scor_abp3 <- c(1,4,5)
dat <- data.frame(id,pdq1,pdq2,pdq3,scor_abp1,scor_abp2,scor_abp3)

# 转换为长格式
dat_long <- dat %>%
  pivot_longer(
    cols = -id,  # 保留id列,其他列参与转换
    names_to = c(".value", "time"),  # .value用于保留指标列名,time存储时间点
    names_pattern = "(.*)(\\d)"  # 正则表达式拆分列名:(指标名)(时间数字)
  ) %>%
  rename(abp = scor_abp)  # 将scor_abp重命名为abp,匹配期望输出

# 查看结果
dat_long

关键参数说明:

  • names_pattern = "(.*)(\\d)":用正则表达式把列名拆成两部分,(.*) 匹配指标名称(如pdq、scor_abp),(\\d) 匹配末尾的时间数字;
  • .value:告诉函数把拆分出的第一部分作为新的列名,对应的值保留;
  • rename:将scor_abp列重命名为abp,和你期望的输出格式一致。

方法2:使用基础R的reshape函数

如果不想加载额外包,可以用基础R的reshape函数:

# 构建原始数据集(和上面一致)
id <- c(1,2,3)
pdq1 <- c(3,5,6)
pdq2 <- c(1,3,4)
pdq3 <- c(4,5,4)
scor_abp1 <- c(1,2,3)
scor_abp2 <- c(2,2,4)
scor_abp3 <- c(1,4,5)
dat <- data.frame(id,pdq1,pdq2,pdq3,scor_abp1,scor_abp2,scor_abp3)

# 转换为长格式
dat_long_base <- reshape(
  dat,
  direction = "long",  # 指定转换方向为长格式
  varying = list(c("pdq1", "pdq2", "pdq3"), c("scor_abp1", "scor_abp2", "scor_abp3")),  # 按指标分组指定重复列
  v.names = c("pdq", "abp"),  # 对应新的指标列名
  timevar = "time",  # 时间变量的名称
  times = 1:3,  # 时间变量的取值
  idvar = "id"  # 分组变量
) %>%
  arrange(id, time)  # 按id和时间排序,匹配期望输出顺序

# 重置行名(可选,让结果更整洁)
row.names(dat_long_base) <- NULL

# 查看结果
dat_long_base

两种方法最终都会生成你需要的长格式数据集,包含id、time、pdq和abp列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:15:59