Что бы я сделал, это:
- Слияние двух вместе
- Сравните каждое имя, чтобы увидеть, соответствует ли оно более чем одному personID (плохо!)
- Если все получилось, отбросьте дубликаты
Так что-то вроде:
datA <- data.frame(personID=c( 123,123,210,210,210,988,988 ),tradeID=c( 10,5,1,7,8,11,8) )
datB <- data.frame(name=c("B","B","J","J","P","P"), tradeID=c( 7,8,3,11,5,10 ) )
mgd <- merge(datA,datB)
library(taRifx)
stopifnot( all( by(mgd$personID,as.factor(mgd$name),distinct) <=1 ) )
result <- subset(mgd, !duplicated(mgd$name),select=c(-tradeID) )
Это не работает на stopifnot, потому что Боб связан с personID 210 и 988, что, скорее всего, является опечаткой в данных вашего примера .... Если это удалено, это работает хорошо:
datA[7,"tradeID"] <- 12
mgd <- merge(datA,datB)
result <- subset(mgd, !duplicated(mgd$name),select=c(-tradeID) )
result
personID name
1 123 P
2 210 B
5 988 J