Tentei melhorar um pouco o script, tendo em mente os comentários do colega Cesar Rabak. Considerei apenas os sobrenomes de língua portuguesa, mas com um pouco de trabalho dá pra estender para outras línguas ("Alexander von Humboldt", "Johannes Diderik van der Waals", "Giuseppe Della Rosa", etc.)
### <code r>
names <- c("Antônio João dos Santos", "Antônio Souza Brás Filho",
"Bento Munhoz Rocha Souza", "Carlos Henrique Souza Sobrinho Neto",
"Damasceno de Souza", "Eustácio da Silva Lima", "Fábio Pereira",
"Gustavo de Araújo Junior"); names
composite <- c("Junior", "Júnior", "Filho", "Neto", "Sobrinho")
composite <- paste(composite, collapse="|")
### Marcando nomes compostos com uso de hífen
names2 <- names
names2 <- gsub(paste0(" (", composite, ")"), "-\\1", names2)
names2 <- gsub(" (d.?.) ", " \\1-", names2)
names2
split <- strsplit(names2, ' ')
terms <- unlist(lapply(split, length)); terms
n <- length(terms)
sapply(1:n, function(x) split[[x]][1]) # Primeiro
sapply(1:n, function(x) split[[x]][terms[x]]) # Último
sapply(1:n, function(x) paste(split[[x]][-c(1,terms[x])], collapse=" ")) # Intermediários
sapply(1:n, function(x) (split[[x]][-c(1,terms[x])])[1]) # Segundo nome...
### Removendo os hífens
split2 <- lapply(split, function(x) gsub("-", " ", x))
sapply(1:n, function(x) split2[[x]][terms[x]]) # Último
### Removendo c("da", "de", "dos")
split3 <- lapply(split2, function(x) gsub("^d.?. ", "", x))
sapply(1:n, function(x) split3[[x]][terms[x]]) # Último
### </code>