【发布时间】:2019-03-04 06:25:28
【问题描述】:
我有一个名为reference 的数据框,它有两个字段trait1 和trait2 我想合并到另一个数据框to_assign。 reference 和 to_assign 都有两个标识符列,id.1 和 id.2。我想执行以下合并:
- 使用
id.1列合并在一起。 - 对于所有仍未分配的条目,合并
to_assign$id.1和reference$id.2 - 对于所有仍未分配的条目,合并
to_assign$id.2和reference$id.1 - 对于所有仍未分配的条目,合并
to_assign$id.2和reference$id.2
这是生成这些数据帧的代码:
id.1 <- LETTERS[1:10]
id.2 <- LETTERS[6:15]
trait1 <- rbinom(length(id.1),1,0.5)
trait2 <- rbinom(length(id.1),1,0.5)
reference <- data.frame(id.1,id.2,trait1,trait2)
id.1 <- LETTERS[runif(100,1,26)]
id.2 <- LETTERS[runif(100,1,26)]
to_assign <- data.frame(id.1,id.2)
我可以通过执行第一次合并、对已分配和未分配的条目进行子集化、从 unassigned 中删除列 trait.1 和 trait.2、使用第二个合并标准重复 unassigned 和 reference 之间的合并来做到这一点,然后调用rbind(assigned,unassigned),冲洗并重复合并标准3和4。这是执行此操作的代码,这会生成我想要的输出为out:
#merge 1.
out <- merge(to_assign, reference[,c('id.1','trait1','trait2')], all.x=T)
#merge 2.
assigned <- out[!is.na(out$trait1),]
unassigned <- out[ is.na(out$trait1),]
unassigned$trait1 <- NULL
unassigned$trait2 <- NULL
unassigned <- merge(unassigned, reference[,c('id.2','trait1','trait2')], by.x = 'id.1', by.y='id.2', all.x=T)
out <- rbind(assigned, unassigned)
#merge 3.
assigned <- out[!is.na(out$trait1),]
unassigned <- out[ is.na(out$trait1),]
unassigned$trait1 <- NULL
unassigned$trait2 <- NULL
unassigned <- merge(unassigned, reference[,c('id.1','trait1','trait2')], by.x = 'id.2', by.y='id.1', all.x=T)
out <- rbind(assigned, unassigned)
#merge 4.
assigned <- out[!is.na(out$trait1),]
unassigned <- out[ is.na(out$trait1),]
unassigned$trait1 <- NULL
unassigned$trait2 <- NULL
unassigned <- merge(unassigned, reference[,c('id.2','trait1','trait2')], all.x=T)
out <- rbind(assigned, unassigned)
但是,这似乎让人头疼,而且我有很多参考数据框需要以这种方式合并。我正在寻找一种更简单的方法来做到这一点,并且每个参考数据帧合并不需要约 20 行代码。我在编写一个函数来执行此操作时遇到问题,因为该函数需要处理引用数据帧,这些数据帧的列名可能不同于 trait1 和 trait2,并且可能超过 2 个。
【问题讨论】: