2016-10-14 4 views
-2

La première colonne de mes données est un facteur qui contient deux ensembles d'informations: le type d'activation fonctionne (A1-4) et le mois où il a été effectué (environ 50 observations au format YYMM) . Une version simplifiée pourrait ressembler à ceci:Comment séparer une colonne

A = data.frame(type.month=c("A1.1605", "A2.1605", "A1.1604", "A2.1604"), value=sample(1:4)) 

> A 
    type.month value 
1 A1.1605  2 
2 A2.1605  4 
3 A1.1604  1 
4 A2.1604  3 

Je voudrais obtenir le types dans une colonne et le months dans une autre et je read que, normalement, cela pourrait se faire avec le paquet reshape2 lorsque les variables sont séparées d'une manière ordonnée (dire par exemple la première moitié est seulement A1 et la seconde moitié est seulement A2). Cependant, le mien alternatif (A1, A2, A1 ...) et contient deux informations (type et mois). Est-ce que reshape2 est toujours un bon outil dans ce cas ou devrais-je penser à autre chose?

Mon but est de garder les quatre types d'activation et les mois dans une même base de données afin de ne pas avoir à les stocker dans quatre fichiers différents.

+1

Vous allez vouloir le stringr. Regarde ça! http://stackoverflow.com/questions/4350440/split-a-column-of-a-data-frame-to-multiple-columns – Joy

+1

Joy, merci, je vais vérifier! @Frank, espérons que le titre est meilleur maintenant. – babesz

+1

Ce n'est pas vraiment remodeler - vous voulez le même nombre de lignes, vous avez juste besoin de casser une colonne. Vous pouvez utiliser une manipulation de chaîne ou un one-liner de 'tidyr',' tidyr :: separate (A, col = type.month, dans = c ("type", "mois")) '. Par défaut, il sépare la chaîne sur tous les caractères non alphanumériques. – Gregor

Répondre

2

Cette sépare la chaîne en utilisant la fonction tidyrseparate:

A = data.frame(type.month=c("A1.1605", "A2.1605", "A1.1604", "A2.1604"), value=sample(1:4)) 


library(dplyr) 
library(tidyr) 
A %>% separate(type.month, c('type','month')) %>% arrange(type, desc(month)) 

donne

type month  value 
A1 1605  4 
A1 1604  2 
A2 1605  1 
A2 1604  3 
+0

Cela fonctionne, merci! Je me demandais s'il n'y a aucun moyen de réorganiser l'ensemble de données comme ceci: – babesz

+0

type valeur mois A1 1605 2 A1 1604 1 A2 1605 4 A2 1604 3 – babesz

+0

désolé, mon commentaire ci-dessus semble moche. Fondamentalement, je voudrais commander le df par type, pas mois. Est-il possible de définir cela dans 'tidyr'? – babesz

0

Zut, j'oublié de mentionner les expressions régulières. Vous devrez échapper à la période comme ceci:

library(stringr) 
str_split_fixed(A$type.month, "\\.", 2)