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_id | m_or_c | edta_code | ipv |
|---|---|---|---|
| 191-0987 | m | EDTA12 | 1 |
| 191-0987 | c | EDTA89 | 1 |
| 191-1245 | m | EDTA20 | 2 |
| 191-1245 | c | EDTA20 | 6 |
| 191-1945 | m | EDTA45 | 0 |
| 191-1945 | c | EDTA49 | 1 |
| 191-3457 | m | EDTA66 | 2 |
| 191-3457 | c | EDTA68 | 4 |
| 191-5467 | m | EDTA74 | 2 |
| 191-5467 | c | EDTA30 | 3 |
| 191-6784 | m | EDTA79 | 2 |
| 191-6784 | c | EDTA95 | 4 |
解决方案
你需要的是行堆叠合并,而非列连接。可以用以下两种方法实现:
方法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
相关产品推荐
相关产品推荐

