Вы можете попробовать следующее решение. Используя предоставленные вами данные в качестве входных данных, мы имеем:
#Data
df1 <- structure(list(last_name = c("Adam", "Barry, S", "Barry, D",
"Charlie", "Don", "Earl", "Johnson, A", "Johnson, T"), ob1 = c("2:01",
"3:30", "", "4:00", "2:00", "2:50", "2:57", "3:15"), ob2 = c("2:02",
"2:50", "2:45", "", "1:50", "2:30", "2:54", "3:10")), class = "data.frame", row.names = c(NA,
-8L))
df2 <- structure(list(last_name = c("Barry", "Don", "Earl", "Johnson",
"Johnson"), first_name = c("Sue", "Regan", "Sage", "Adam", "Terry"
), `1mile.time` = c("4:45", "4:35", "4:50", "4:37", "4:50"),
`500m.time` = c("1:50", "0:50", "1:30", "1:54", "2:10")), class = "data.frame", row.names = c(NA,
-5L))
Теперь код:
#Format vars
df1$last_name <- trimws(df1$last_name)
df2$last_name <- trimws(df2$last_name)
df2$first_name <- trimws(df2$first_name)
#Create index to check names
index2 <- which(df2$last_name %in% df1$last_name)
df2$Empty <- NA
df2$Empty[index2] <- df2$last_name[index2]
#Replace NA
df2$Empty <- ifelse(is.na(df2$Empty),paste0(df2$last_name,', ',substring(df2$first_name,1,1)),df2$Empty)
#Format data with new id
df3 <- df2
df3$last_name <- df3$Empty
df3$Empty <- NULL
#Now merge
Merged <- merge(df1,df3,by='last_name',all.x=T)
#Arrange
Merged <- Merged[,c(1,4,2,3,5,6)]
В итоге вы получите следующее:
last_name first_name ob1 ob2 1mile.time 500m.time
1 Adam <NA> 2:01 2:02 <NA> <NA>
2 Barry, D <NA> 2:45 <NA> <NA>
3 Barry, S Sue 3:30 2:50 4:45 1:50
4 Charlie <NA> 4:00 <NA> <NA>
5 Don Regan 2:00 1:50 4:35 0:50
6 Earl Sage 2:50 2:30 4:50 1:30
7 Johnson, A Adam 2:57 2:54 4:37 1:54
8 Johnson, T Terry 3:15 3:10 4:50 2:10
Мы использовали index, чтобы проверить имена, а затем создать новый идентификатор для объединения. Просто помните, что в ваших данных не все фамилии указаны как имена, поэтому в некоторых именах будет NA
.