У меня есть датафрейм из более чем 5000 имен и фамилий. Вот первые 20 строк.
df <- data.frame(
First.Name = c("Larry","Darren","Howard",
"Antonio","John","Alex","Tom","Jose","Robert","Michael",
"Will","Kareem","Jack","Howard","Sam","David",
"Carlo","Johnson","Andy","Rodger"),
Last.Name = c("James","King","Singer",
"Howard","Michael","Peters","John","Reyes",
"Blake","Samuel","Woods","Patrick","Shun",
"Dieter","Johnson","Fant","Patrick","James",
"Berry","Black")
)
Я пытаюсь создать цепочки имен и найти самую длинную цепочку имен. Например, Антонио Ховард и Говард Сингер объединяются, создавая цепочку «Антонио Ховард Сингер». Каждое имя может быть использовано один раз. Я думаю, что много задумался, но я придумал код, который работает частично. Это позволяет мне найти количество имен в самой длинной цепочке для каждого имени и показывает мне индексы строк, которые соответствуют имени с фамилией данной строки. Вот код, чтобы вы могли лучше понять:
#Store the indices of each person's name match in a list
matches <- list()
for (i in 1:nrow(df)) {
x <- c()
for (j in 1:nrow(df)) {
if (df$Last.Name[i] == df$First.Name[j]) {
x <- c(x,j)
}
}
print(i)
matches[[i]] <- x
}
#Function to get the indices of each person's matches
getmatches <- function(x){
a <- c()
if (length(x) < 1){
break()
} else{
for(i in 1:length(x)){
a <- c(a, matches[[x[i]]])
}
}
if(length(a) >= 1){
for (j in 1:length(a)){
#Remove if a last name is the same as the person's own first name
if (a[j] == x){
a <- a[-j]
} else {
next()
}
}
}
return(a)
}
#Get the length of longest name chain starting with each
#person's name
df$longestchain <- 0
for (i in 1:nrow(df)){
y <- getmatches(df[i])
x <- 1
while(length(y) > 0){
x <- x + 1
y <- getmatches(y)
}
df$longestchain[i] <- x
}
Это дает мне имя, которое запускает самую длинную цепочку имен, и я могу посмотреть на совпадения из списка совпадений и найти самую длинную цепочку имен. Тем не менее, это не самый эффективный способ ведения дел и не работает для более сложных задач. Например: если каждая комбинация имени / фамилии также считается противоположной (Ларри Джеймс также может быть Джеймсом Ларри). Как я могу изменить это или полностью воссоздать, чтобы алгоритм просто дал мне самую длинную цепочку имен, используя каждое имя один раз?