2017-09-11 1 views
-2

J'ai une seule colonne avec des valeurs de chaîne séparées comme:Comment analyser seul vecteur de chaînes de caractères pour les noms de colonnes/valeurs de la colonne par modèle

         strings 
1 J96C75D56I96Z95W39S79H89K69Y49B99R49L49U61 
2 J96C75D56I96Z95W39S79H89K69Y49B99R49L49U61 

Je veux le convertir en une trame de données en utilisant un modèle. Par exemple, les deux premières positions de caractères dans une chaîne sont le nom de la première colonne (J9) et la troisième position est la valeur de cette première colonne (6). Le modèle est 2,1,2,1 ...

Ce que je veux est similaire à la fonction text-to-columns dans Excel. Comment puis-je le faire en R?

Résultats escomptés:

J9 C7 5D 
6 5 5 and so on.. 
6 5 5 and so on.. 
+0

Cliquez sur le lien pour obtenir images.I ont utilisé Excel (texte à colonnes fonction) à convert..But que je veux faire dans R. – user8545255

+1

S'il vous plaît ne fournissent pas de données sous forme d'images. Fournissez-le comme un texte qui peut être lu dans R. Aussi, expliquez l'algorithme pour passer de l'entrée à la sortie et fournissez le code R pour ce que vous avez essayé. –

+0

@ user8545255 - J'ai remarqué qu'un chiffre supplémentaire doit être ajouté à la fin de la chaîne d'échantillons que vous avez fournie. Alors s'il vous plaît utilisez l'exemple de chaîne que j'ai fourni en essayant ma solution. – www

Répondre

3

Il y a plusieurs façons de le faire, mais voici une façon intuitive qui pourrait aider à enseigner des concepts de R utiles dans le processus:

x <- c("J96C75D56I96Z95W39S79H89K69Y49B99R49L49U61") 

colNames <- paste0(unlist(strsplit(x, ""))[c(TRUE,FALSE,FALSE)], 
        unlist(strsplit(x, ""))[c(FALSE,TRUE,FALSE)]) 

values <- paste0(unlist(strsplit(x, ""))[c(FALSE,FALSE,TRUE)]) 

df <- data.frame(matrix(values,nrow=1)) 
colnames(df) <- colNames 

Sortie:

J9 C7 D5 I9 Z9 W3 S7 H8 K6 Y4 B9 R4 L4 U6 
1 6 5 6 6 5 9 9 9 9 9 9 9 9 1 

EDIT:

Si vous avez plusieurs chaînes comme ce que vous avez à se fondre dans une trame de données, voici une option:

df <- data.frame(strings=c("J96C75D56I96Z95W39S79H89K69Y49B99R49L49U61", 
          "J96C75D56I96Z95W39S79H89K69Y49B99R49L49U61"), 
       stringsAsFactors = FALSE) 

colNames <- paste0(unlist(strsplit(df[1,], ""))[c(TRUE,FALSE,FALSE)], 
        unlist(strsplit(df[1,], ""))[c(FALSE,TRUE,FALSE)]) 

x <- lapply(df$strings, 
      function(i) matrix(paste0(unlist(strsplit(i,""))[c(FALSE,FALSE,TRUE)]),nrow=1)) 

require(plyr) 
df <- data.frame(rbind.fill.matrix(x)) 
colnames(df) <- colNames 

Sortie:

J9 C7 D5 I9 Z9 W3 S7 H8 K6 Y4 B9 R4 L4 U6 
1 6 5 6 6 5 9 9 9 9 9 9 9 9 1 
2 6 5 6 6 5 9 9 9 9 9 9 9 9 1 
+0

Merci, il a répondu à ma question. Et, si j'ai 20 observations de lakh (nombre de rangées). Est-ce que je suis la même procédure ou y at-il une meilleure façon. – user8545255

+0

@ user8545255 - De rien. Voir la modification ci-dessus pour une utilisation avec plusieurs chaînes. – www

+0

@ user8545255 - N'oubliez pas de sélectionner la coche à côté de cette réponse pour aider la communauté à savoir qu'elle a été résolue et pour aider les autres ayant la même question à trouver leur réponse encore plus rapidement. – www

0

si vos lignes sont de la même longueur (commune chose dans les fichiers txt), vous pouvez essayer avec un format largeur fixe:

read.fwf() 

quelque chose comme

read.fwf(yourfile.txt, widths=c(2,1,2,1), colnames=c(variable1,value1,variable2,value2)) 
+0

Réponse intéressante. Pouvez-vous fournir des exemples de données pour les tester? – www

+0

'rio_frio <- read.fwf (" http://smn.conagua.gob.mx/tools/RESOURCES/Diarios/15082.txt ", widths = c (12, 6, 7, 7, 4), skip = 21)' (dans ce cas, vous devez supprimer la dernière ligne) 'rio_frio <- rio_frio [-dim (rio_frio) [1], ] 'et ensuite' colnames (rio_frio) <- c ("date", "précipitation", "évaporation", "tmax", "tmin") ' –