R语言中基于id列实现数据集行转列:是否有现成函数?
在R中实现基于id的行转列操作
当然不用自己从零编码!R里有好几个成熟的工具可以轻松完成这个行转列(宽表转换)的需求,下面给你介绍几个最常用的方法:
方法1:使用tidyr包的pivot_wider(推荐)
这是tidyverse生态里的主流方法,语法清晰且灵活。首先我们先构造你的示例数据集:
# 构造示例数据 df <- data.frame( id = c(1,1,2,2,3,3), time = c(2,3,2,3,2,3), residuals = c(-2.0, 2.1, -1.3, 2, -1.4, 1.5) )
然后用pivot_wider直接转换,同时通过names_glue参数一步生成你想要的列名:
library(tidyr) df_wide <- df %>% pivot_wider( id_cols = id, # 作为分组依据的列 names_from = time, # 用来生成新列名的原列 values_from = residuals, # 填充新列值的原列 names_glue = "time{time-1}" # 自定义列名:time2→time1,time3→time2 ) # 查看结果 print(df_wide)
运行后你会得到完全符合要求的输出:
id time1 time2 1 1 -2.0 2.1 2 2 -1.3 2.0 3 3 -1.4 1.5
方法2:使用reshape2包的dcast
如果你习惯用reshape2包,dcast也是经典的行转列工具:
library(reshape2) df_wide <- dcast( data = df, formula = id ~ paste0("time", time-1), # 公式格式:行分组 ~ 列名生成规则 value.var = "residuals" # 用来填充值的列 )
方法3:基础R的reshape函数
不用额外安装包的话,基础R自带的reshape函数也能完成:
df_wide <- reshape( df, idvar = "id", # 分组列 timevar = "time", # 用来生成宽列的列 direction = "wide" # 指定转换方向为宽表 ) # 重命名列以匹配需求 names(df_wide) <- c("id", "time1", "time2")
以上几种方法都能实现你要的效果,其中pivot_wider因为其可读性和扩展性,是现在最推荐的方案。
内容的提问来源于stack exchange,提问作者Adnan Jamil
相关产品推荐
相关产品推荐

