J'aimerais prendre des données du formulaire
before = data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar_2'))
attr type
1 1 foo_and_bar
2 30 foo_and_bar_2
3 4 foo_and_bar
4 6 foo_and_bar_2
et utilisez split()
la colonne " type
" ci-dessus pour obtenir quelque chose comme ceci:
attr type_1 type_2
1 1 foo bar
2 30 foo bar_2
3 4 foo bar
4 6 foo bar_2
J'ai trouvé quelque chose d'incroyablement complexe impliquant une certaine forme de apply
cela qui a fonctionné, mais je l'ai depuis égaré. Cela semblait beaucoup trop compliqué pour être le meilleur moyen. Je peux utiliser strsplit
comme ci-dessous, mais je ne sais pas comment récupérer cela en 2 colonnes dans le bloc de données.
> strsplit(as.character(before$type),'_and_')
[[1]]
[1] "foo" "bar"
[[2]]
[1] "foo" "bar_2"
[[3]]
[1] "foo" "bar"
[[4]]
[1] "foo" "bar_2"
Merci pour tout pointeur. Je n'ai pas encore tout à fait grillé les listes R.
left_right <- str_split_fixed(as.character(split_df),'\">',2)
str_split_fixed("aaa...bbb", fixed("..."), 2)
fonctionne très bien avecfixed()
"Match a fixed string" dans l'pattern=
argument..
signifie «n'importe quel caractère» en regex.Une autre option consiste à utiliser le nouveau package tidyr.
la source
str_split_fixed
et en ajoutant des colonnes à la trame de données existante)?5 ans après l'ajout de la
data.table
solution obligatoireNous pourrions également à la fois nous assurer que les colonnes résultantes auront des types corrects et améliorer les performances en ajoutant
type.convert
et desfixed
arguments (car ce"_and_"
n'est pas vraiment une expression régulière)la source
'_and_'
patterns varie, vous pouvez trouver le nombre maximum de correspondances (ie futures colonnes) avecmax(lengths(strsplit(before$type, '_and_')))
strsplit
il crée un seul vecteur avec 2 valeurs dans chaque emplacement, il letstrsplit
transpose donc en 2 vecteurs avec une seule valeur dans chacun.paste0
est juste utilisé pour créer les noms des colonnes, il n'est pas utilisé sur les valeurs. Sur le LHS de l'équation se trouvent les noms des colonnes, sur le RHS se trouve l'opération split + transpose sur la colonne.:=
signifie " assign in place ", donc vous ne voyez pas l'<-
opérateur d'affectation là-bas.Encore une autre approche: utiliser
rbind
surout
:Et pour combiner:
la source
strcapture("(.*)_and_(.*)", as.character(before$type), data.frame(type_1 = "", type_2 = ""))
Notez que sapply avec "[" peut être utilisé pour extraire le premier ou le deuxième élément de ces listes afin:
Et voici une méthode gsub:
la source
voici une doublure dans le même sens que la solution d'aniko, mais en utilisant le package stringr de hadley:
la source
stringr
paquet.Pour ajouter aux options, vous pouvez également utiliser ma
splitstackshape::cSplit
fonction comme ceci:la source
Un moyen simple est d'utiliser
sapply()
et la[
fonction:Par exemple:
sapply()
Le résultat est une matrice et doit être transposé et converti en une trame de données. Ce sont alors quelques manipulations simples qui donnent le résultat souhaité:À ce stade,
after
c'est ce que vous vouliezla source
Le sujet est presque épuisé, j'aimerais cependant proposer une solution à une version un peu plus générale où l'on ne connaît pas a priori le nombre de colonnes de sortie. Ainsi, par exemple, vous avez
Nous ne pouvons pas utiliser dplyr
separate()
parce que nous ne connaissons pas le nombre de colonnes de résultat avant le fractionnement, j'ai donc créé une fonction qui utilisestringr
pour fractionner une colonne, étant donné le modèle et un préfixe de nom pour les colonnes générées. J'espère que les modèles de codage utilisés sont corrects.On peut ensuite utiliser
split_into_multiple
dans une pipe dplyr comme suit:Et puis nous pouvons utiliser
gather
pour ranger ...la source
Voici une doublure de base R one qui chevauche un certain nombre de solutions précédentes, mais renvoie un data.frame avec les noms propres.
Il utilise
strsplit
pour décomposer la variable, etdata.frame
avecdo.call
/rbind
pour remettre les données dans un data.frame. L'amélioration incrémentielle supplémentaire est l'utilisation desetNames
pour ajouter des noms de variables au data.frame.la source
Cette question est assez ancienne mais j'ajouterai la solution que j'ai trouvée la plus simple actuellement.
la source
Depuis R version 3.4.0, vous pouvez utiliser à
strcapture()
partir du package utils (inclus avec les installations de base R), en liant la sortie sur les autres colonnes.la source
Une autre approche si vous voulez continuer
strsplit()
est d'utiliser launlist()
commande. Voici une solution dans ce sens.la source
base mais probablement lente:
la source
Voici une autre solution de base R. Nous pouvons utiliser
read.table
mais comme il n'accepte qu'unsep
argument sur un octet et ici nous avons un séparateur sur plusieurs octets que nous pouvons utilisergsub
pour remplacer le séparateur sur plusieurs octets par n'importe quel séparateur sur un octet et l'utiliser commesep
argument dansread.table
Dans ce cas, nous pouvons également le raccourcir en le remplaçant par un
sep
argument par défaut afin de ne pas avoir à le mentionner explicitementla source