Créer une nouvelle colonne avec dplyr de muter et de sous-chaîne de la colonne existante
J'ai un dataframe avec une colonne de chaînes et souhaitez extraire des sous-chaînes de ces dans une nouvelle colonne.
Voici un exemple de code et les données montrant que je veux prendre de la chaîne après le dernier caractère de soulignement dans le id
colonne afin de créer un new_id
colonne.
Le id
entrée de la colonne a toujours 2 caractères de soulignement et c'est toujours la dernière sous-chaîne que j'aimerais.
df = data.frame( id = I(c("abcd_123_ABC","abc_5234_NHYK")), x = c(1.0,2.0) )
require(dplyr)
df = df %>% dplyr::mutate(new_id = strsplit(id, split="_")[[1]][3])
Je m'attendais à strsplit d'agir sur chaque ligne à son tour.
Cependant, la new_id
colonne ne contient que ABC
dans chaque ligne, alors que je voudrais ABC
dans la ligne 1 et NHYK
dans la ligne 2. Savez-vous pourquoi cela échoue et la façon d'atteindre ce que je veux?
strsplit
. le [[1]]
attrape toujours le premier élément de la liste.dans la base de R, c'est aussi simple que d'une petite regex magie:
df$newVar <- sub(".*_([A-Z]+)$", "\\1", df$id)
.OriginalL'auteur PM. | 2017-02-01
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
stringr::str_extract
:La regex dit, correspondre à un ou plusieurs (
+
) des personnages qui ne sont pas_
(la négation de la[^ ]
), suivie par la fin de la chaîne ($
).OriginalL'auteur Sam Firke
Utilisation
dplyr::rowwise
:Autres solutions sont abordées ici:
http://www.expressivecode.org/2014/12/17/mutating-using-functions-in-dplyr/
dplyr
comme il ne peut pas bénéficier de vectorisé opérations. Pourtant, +1 pour l'astuce.OriginalL'auteur Philipp Merkle
Une alternative sans regex et en gardant à l'
tidyverse
style est à utilisertidyr::separate()
. Remarque, ce n'supprimer la colonne d'entrée par défaut (remove=FALSE
pour éviter cela).OriginalL'auteur vincentmajor
Voici une façon d'utiliser
strsplit
d'une manière générale pour faire ce que vous cherchez.OriginalL'auteur Lloyd Christmas