如何合并含重复基因名的Data Frame并保持行对应关系?
问题:如何实现重复基因名Data Frame的按行精准合并
原始数据
data1 <- data.frame(gene=c("ABCD11","ABCD2","ABCD2"),value1=c(2,5,9)) data2 <- data.frame(gene=c("ABCD11","ABCD2","ABCD2"),value2=c(32,35,39))
问题现象
使用merge()、left_join()、full_join()等常规合并函数时,由于gene列存在重复值,函数会将所有匹配gene的行进行关联,产生笛卡尔积形式的结果,无法得到按行一一对应的预期合并效果。
解决方案
方案1:直接按列绑定(行顺序完全一致时首选)
因为两个Data Frame的行顺序完全对应,直接合并列即可,注意去除重复的gene列:
# 基础R实现 data_merge <- cbind(data1, value2 = data2$value2) # dplyr包实现 library(dplyr) data_merge <- bind_cols(data1, data2 %>% select(-gene))
执行后得到预期结果:
> data_merge gene value1 value2 1 ABCD11 2 32 2 ABCD2 5 35 3 ABCD2 9 39
方案2:添加行号作为辅助连接键(行顺序可能变动时适用)
如果后续数据行顺序可能改变,或需要严格保证组内(同一gene)的行按顺序匹配,可以添加行号作为辅助连接键:
# 基础R实现 data1$id <- seq(nrow(data1)) data2$id <- seq(nrow(data2)) data_merge <- merge(data1, data2, by = c("gene", "id")) data_merge$id <- NULL # 移除辅助列 # dplyr包实现 library(dplyr) data_merge <- data1 %>% mutate(id = row_number()) %>% left_join(data2 %>% mutate(id = row_number()), by = c("gene", "id")) %>% select(-id)
内容的提问来源于stack exchange,提问作者Arnoneel Sinha
相关产品推荐
相关产品推荐

