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

R语言中按行堆叠两个数据集,重复展示相同subject_id

问题描述

需要合并两个数据集df1和df2,使每个subject_id对应的两条记录(分别来自df1的m类型和df2的c类型)上下排列。尝试用full_join(df1, df2, by = "subject_id")得到的是列合并结果,不符合需求。

数据集结构

df1

df1 <- structure (list(
  subject_id = c("191-5467", "191-6784", "191-3457", "191-0987", "191-1245", "191-1945"), 
  m_or_c = c("m","m","m","m","m","m"),
  edta_code = c("EDTA45", "EDTA79", "EDTA20", "EDTA66", "EDTA12", "EDTA74"), 
  ipv = c("0", "3", "2", "2", "1", "2")), 
  class = "data.frame", row.names = c(NA, -6L))

df2

df2 <- structure (list(
  subject_id = c("191-5467", "191-6784", "191-3457", "191-0987", "191-1245", "191-1945"), 
m_or_c = c("c","c","c","c","c","c"),
  edta_code = c("EDTA49", "EDTA95", "EDTA20", "EDTA68", "EDTA89", "EDTA30"), 
  ipv = c("1", "4", "6", "4", "1", "3")), 
  class = "data.frame", row.names = c(NA, -6L))

尝试的代码

df3 <- full_join(df1, df2, by = "subject_id")

当前问题

上述代码会将两个数据集按subject_id列合并,生成包含edta_code.x、edta_code.y等后缀的列,不是需要的行堆叠形式。

期望输出

每行对应一条记录,相同subject_id重复出现,结构如下:

subject_idm_or_cedta_codeipv
191-0987mEDTA121
191-0987cEDTA891
191-1245mEDTA202
191-1245cEDTA206
191-1945mEDTA450
191-1945cEDTA491
191-3457mEDTA662
191-3457cEDTA684
191-5467mEDTA742
191-5467cEDTA303
191-6784mEDTA792
191-6784cEDTA954

解决方案

你需要的是行堆叠合并,而非列连接。可以用以下两种方法实现:

方法1:使用dplyr::bind_rows()

bind_rows()可以直接将结构相同的数据集按行合并,之后按subject_id排序即可:

library(dplyr)

df3 <- bind_rows(df1, df2) %>% 
  arrange(subject_id)

方法2:使用基础R的rbind()

如果两个数据集列名完全一致,基础R的rbind()也能实现相同效果,再手动排序:

df3 <- rbind(df1, df2)
df3 <- df3[order(df3$subject_id), ]

结果验证

执行上述代码后,df3的结构与你期望的输出一致:每个subject_id对应两条记录(m和c类型),按行排列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:44:51