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
相关产品推荐
相关产品推荐

