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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:40:41