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

在R语言中整合3个数据表并将指定多列堆叠为一列的实现方法

嘿,这个需求在R里很好实现,我给你两种常用的方案,你可以根据自己的习惯和数据规模来选:

方案一:用tidyverse(直观易读,适合大多数场景)

如果你平时习惯用tidyverse工具链,这个方法最直观:

  1. 合并三个数据表
    假设你的三个数据表分别命名为df1、df2、df3,先用bind_rows()把它们合并成一个大表:
library(tidyverse)
combined_df <- bind_rows(df1, df2, df3)
  1. 重塑为长格式数据
    用pivot_longer()函数来处理多组in-out列的转换,核心是通过正则匹配列名的规律:
final_df <- combined_df %>%
  pivot_longer(
    cols = everything(),
    # 把列名拆成两部分:.value保留前缀(in/out)作为新列名,group存后面的数字(可忽略)
    names_to = c(".value", "group"),
    # 正则匹配:捕获in/out前缀和后面的数字
    names_pattern = "(in|out)(\\d+)"
  ) %>%
  # 只保留我们需要的in和out列,去掉临时的group列
  select(in, out)

这个正则表达式"(in|out)(\\d+)"会自动把in1拆成in和1、out2拆成out和2,.value参数会让所有前缀为in的列合并成新的in列,前缀为out的列合并成新的out列,完全匹配你要的结果。

方案二:用data.table(速度更快,适合大数据)

如果你的数据量很大(三个表加起来12万+行),data.table的处理速度会比tidyverse快不少,适合这种场景:

library(data.table)
# 合并三个表
combined_dt <- rbindlist(list(df1, df2, df3))
# 重塑数据
final_dt <- melt(
  combined_dt,
  # 匹配所有以in开头和out开头的列,自动配对
  measure.vars = patterns("^in", "^out"),
  # 指定新列的名称
  value.name = c("in", "out")
)[, .(in, out)]  # 选择需要的两列

melt()的patterns参数会自动识别in1/in2/in3和out1/out2/out3的对应关系,直接生成目标结构。

验证结果

你可以用head(final_df)或者head(final_dt)查看前几行,应该和你给出的示例结构完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:29:24