2017-05-08 1 views
1

Je tente de supprimer l'espace entre les deux derniers mots d'une trame contenant plusieurs chaînes. J'ai essayé d'utiliser gsub mais ma tentative de gsub("(\\s){1}$","",df1$V1) semble tout à fait fausse! df1 est mon ensemble de données et df2 est le résultat que je suis après.Suppression de l'espace entre les deux derniers mots d'une chaîne dans R

df1 <- data.frame(V1=c("Apple Pear Orange, AAA 111", "Grapes Banana Pear . BBB 222", "Orange Kiwi Melon , CCC 333", "Apple DDD 444", "Kiwi Melon Orange CCC 333", "Apple Pear Orange, AAA 111", "Tomato Cucumber EEE 222", "Seagull Pigeon ZZZ 111"), stringsAsFactors = F) 

df2 <- data.frame(V1=c("Apple Pear Orange, AAA111", "Grapes Banana Pear . BBB222", "Orange Kiwi Melon , CCC333", "Apple DDD444", "Kiwi Melon Orange CCC333", "Apple Pear Orange, AAA111", "Tomato Cucumber EEE222", "Seagull Pigeon ZZZ111"), stringsAsFactors = F) 

Répondre

3

Ou encore ceci:

gsub("(.*)\\s","\\1",df1$V1) 
+0

Cela fonctionne pour toutes les chaînes de mon jeu de données réel. Merci. – Chris

3

Vous pouvez utiliser des groupes de capture:

sub("(.*)\\s+([^\\s]+)$", "\\1\\2", df1$V1) 
#[1] "Apple Pear Orange, AAA111" "Grapes Banana Pear . BBB222" "Orange Kiwi Melon , CCC333" "Apple DDD444"    
#[5] "Kiwi Melon Orange CCC333" "Apple Pear Orange, AAA111" "Tomato Cucumber EEE222"  "Seagull Pigeon ZZZ111" 

Cette capture comme premier groupe un certain nombre de caractères, puis 1+ espaces et comme deuxième groupe 1+ caractères qui ne sont pas des espaces jusqu'à la fin de la chaîne. Il extrait ensuite uniquement les deux groupes de capture sans les espaces intermédiaires.

+0

Pourriez-vous utiliser le '\\ w +' pour les mots à la place? 'gsub (" (\\ w +) (\\ w + $) "," \\ 1 \\ 2 ", df1 $ V1)'? Juste une pensée ... –

+1

@MikeH., Bien sûr, mais pourquoi ne proposez-vous pas cela comme une réponse séparée? –

+0

Merci. Je ne sais pas pourquoi, mais votre syntaxe ne fonctionne pas pour toutes les chaînes de mon jeu de données réel lorsque les réponses par hhh et Mike H. – Chris

1

Voulez-vous profiter de la réponse de Docendo, vous pouvez utiliser \\w+ pour correspondre à des mots d'une longueur:

gsub("(\\w+)\\s+(\\w+$)", "\\1\\2" ,df1$V1) 

#[1] "Apple Pear Orange, AAA111" "Grapes Banana Pear . BBB222" "Orange Kiwi Melon , CCC333" 
#[4] "Apple DDD444"    "Kiwi Melon Orange CCC333" "Apple Pear Orange, AAA111" 
#[7] "Tomato Cucumber EEE222"  "Seagull Pigeon ZZZ111" 

Ensuite, vous pouvez utiliser la même idée avec les groupes de capture.

+0

Merci. Cela fait exactement ce que je recherchais aussi, mais comme j'ai répondu d'abord, j'ai accepté leur solution comme réponse. – Chris