在R语言中整合3个数据表并将指定多列堆叠为一列的实现方法
嘿,这个需求在R里很好实现,我给你两种常用的方案,你可以根据自己的习惯和数据规模来选:
方案一:用tidyverse(直观易读,适合大多数场景)
如果你平时习惯用tidyverse工具链,这个方法最直观:
- 合并三个数据表
假设你的三个数据表分别命名为df1、df2、df3,先用bind_rows()把它们合并成一个大表:
library(tidyverse) combined_df <- bind_rows(df1, df2, df3)
- 重塑为长格式数据
用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
相关产品推荐
相关产品推荐

