2016-01-11 3 views
2

J'ai dataframe avec 2 colonnes:obtenir les premières lettres des noms doubles/tripple-baril en data.frame

> df1 
     Surname  Name 
1 The Builder  Bob 
2 Zeta-Jones Catherine 

Je veux ajouter une troisième colonne « Shortened_Surname » qui contient les premières lettres de tous les mots dans le champ de nom de famille:

 Surname  Name Shortened_Surname 
1 The Builder  Bob    TB 
2 Zeta-Jones Catherine    ZJ 

Notez le "-" dans le deuxième nom. J'ai des noms de famille barrel séparés par espaces et traits d'union.

J'ai essayé:

Etape 1:

> strsplit(unlist(as.character(df1$Surname))," ") 
[[1]] 
[1] "The"  "Builder" 

[[2]] 
[1] "Zeta-Jones" 

Ma recherche suggère que je pourrais peut-être utiliser strtrim comme l'étape 2, mais tout ce que j'ai trouvé est de plusieurs façons comment ne pas faire il.

+0

Les lettres sont-elles toujours en majuscules? – Heroka

+0

@Heroka non, mais je vais utiliser 'casefold' pour faire tout en minuscules – gmarais

Répondre

4

Vous pouvez cibler l'espace, le trait d'union et le début de la ligne avec des solutions de recherche. Par exemple, vous ne importe quel caractère (.) non précédé par le début de la ligne, un espace ou un trait d'union doit être remplacée à « »:

with(df, gsub("(?<!^|[ -]).", "", Surname, perl=TRUE)) 
[1] "TB" "ZJ" 

ou

with(df, gsub("(?<=[^ -]).", "", Surname, perl=TRUE)) 

Le deuxième gsub substituts un espace vide ("") pour tout caractère précédé d'un caractère qui n'est pas " " ou "-".

1

Vous pouvez essayer cela, si le format des noms est comme indiqué dans les données d'entrée:

library(stringr) 
df$Shortened_Surname <- sapply(str_extract_all(df$Surname, '[A-Z]{1}'), function(x) paste(x, collapse = '')) 

sortie est la suivante:

 Surname  Name Shortened_Surname 
1 The Builder  Bob    TB 
2 Zeta-Jones Catherine    ZJ 

Si le format des noms est un peu incohérent, vous devrez modifier le motif ci-dessus pour le capturer. Vous pouvez utiliser les opérateurs |, & à l'intérieur du motif pour combiner plusieurs motifs.