У меня есть фрейм данных с именем 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)
Я могу сделать это путем выполнения первого слияния, поднабора назначенных и неназначенных записей, удаления столбцов trait.1
и trait.2
из unassigned
, повторения слияния между 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.