1
votes

Échange du prénom avec le nom et vice versa dans R

J'ai un ensemble de données avec une colonne de nom qui contient le nom et le prénom. Je dois les échanger pour avoir le prénom et le nom de famille. Voici mon ensemble de données:

| Id | Name          | Street     | State |
|----|---------------|------------|-------|
| 10 | MAYANK NAGAR  | Newark Ave | NJ    |
| 50 | MARK PETER    | Grant Ave  | TX    |

J'ai essayé le code ci-dessous pour fonctionner:

sub("(\\w+),\\s(\\w+)","\\2\\1", dummy$Name)

Cependant, cela me donne le nom tel qu'il est, c'est-à-dire "NAGAR MAYANK" et "PETER MARK".

J'ai besoin de la sortie comme ci-dessous:

df=data.frame(Id=c("10","50"), Name=c("NAGAR MAYANK","PETER MARK"), Street= c("Newark Ave","Grant Ave"),Country=c("NJ","TX"))


1 commentaires

Vous avez un , dans votre expression régulière après le premier mot, ce qui provoque l'échec de la recherche.


3 Réponses :


4
votes

Pour cela, vous pouvez utiliser word () de la bibliothèque stringr :

df$Name <- with(df, paste(word(Name, 2), word(Name, 1)))

  Id         Name     Street Country
1 10 MAYANK NAGAR Newark Ave      NJ
2 50   MARK PETER  Grant Ave      TX


0 commentaires

4
votes

Votre expression régulière est presque correcte, elle inclut juste une virgule qui n'est pas présente dans les chaînes donc le modèle n'est pas détecté et aucune correspondance / remplacement n'est effectué. (Comme indiqué par @Mosquite)

df$Name <- sub('(\\w) (\\w)', '\\2 \\1', df$Name)

df
#   Id         Name     Street Country
# 1 10 MAYANK NAGAR Newark Ave      NJ
# 2 50   MARK PETER  Grant Ave      TX


1 commentaires

Pouvez-vous vérifier le regex? Pour moi, sub ('(\\ w +) (\\ w +)', '\\ 2 \\ 1', df $ Name) a fonctionné.



3
votes

Une autre solution pourrait être cSplit:

library(splitstackshape)
df.tmp <- cSplit(df, "Name", " ")
df$Name <- paste(df.tmp$Name_2, df.tmp$Name_1, sep =" ")

> df
  Id         Name     Street Country
1 10 MAYANK NAGAR Newark Ave      NJ
2 50   MARK PETER  Grant Ave      TX


0 commentaires