2016-09-24 1 views
0

J'ai une trame de données (data3) avec une colonne nommée "Collector". Dans cette colonne, j'ai des caractères alpha-numériques. Par exemple: "Ruiz et Galvis 650". Je dois extraire les caractères alphabétiques et les caractères numériques séparément, et de créer deux nouvelles colonnes, l'une avec les chiffres de cette chaîne (colid) et l'autre avec tous les mots (Col):Extraire tous les mots d'une chaîne et créer une colonne avec le résultat

ENTRÉE:

Collector      Times  Sample 
Ruiz and Galvis 650    9   SP.1    
Smith et al 469     8   SP.1 

SORTIE PRÉVUE

Collector      Times  Sample  ColID Col 
Ruiz and Galvis 650    9   SP.1  650  Ruiz and Galvis 
Smith et al 469     8   SP.1  469  Smith et al 

J'ai essayé ce qui suit, mais lorsque je tente de sauvegarder le fichier que je reçois une erreur (erreur dans .External2 (C_writetable, x, fichier, nrow (x), p, rnames, sep, eol,: type 'implémenté' non implémenté dans 'EncodeElement'):

regexp <- "[[:digit:]]+" 
data3$colID<- NA 
data3$colID <- str_extract (data3$Collector, regexp) 

data3$Col<- NA 
regexp <-"[[:alpha:]]+" 
data3$Col <- (str_extract_all (data3$Collector, regexp)) 
write.table(data3, file = paste("borrar2",".csv", sep=""), quote=T, sep = ",", row.names = F) 

Répondre

2

Le problème est que str_extract_all ne trouve pas seulement une seule chaîne, mais une liste de plusieurs. Par exemple:

> dput(str_extract_all("Ruiz and Galvis 650", "[[:alpha:]]+")) 
list(c("Ruiz", "and", "Galvis")) 

Une trame de données avec des éléments imbriqués (comme ci-dessus) ne peut apparemment pas être enregistrées dans un fichier.

Cependant, si vous mettez à jour le modèle regex pour correspondre à des espaces ainsi que des lettres, vous pouvez revenir à l'utilisation de la place str_extract:

> dput(str_extract("Ruiz and Galvis 650", "[[:alpha:] ]+")) 
"Ruiz and Galvis " 

Notez l'espace dans la seconde regex. Cela correspond à toutes les lettres/espaces comme une chaîne et vous permettra d'écrire le data.frame dans un fichier.

+0

qui a résolu mon problème. Merci beaucoup! –

0

Si vos données est aussi uniforme que votre exemple montre alors ceci est une autre option:

library(stringi) 
library(purrr) 
library(dplyr) 

df <- data.frame(Collector=c("Ruiz and Galvis 650", "Smith et al 469"), 
       Times=c(9, 8), 
       Sample=c("SP.1", "SP.1"), 
       stringsAsFactors=FALSE) 

stri_match_first(df$Collector, regex="([[:alpha:][:space:]]+) ([[:digit:]]+)") %>% 
    as.data.frame(stringsAsFactors=FALSE) %>% 
    select(Col=V2, ColID=V3) %>% 
    bind_cols(df) %>% 
    select(-Collector) 
##    Col ColID Times Sample 
## 1 Ruiz and Galvis 650  9 SP.1 
## 2  Smith et al 469  8 SP.1 
+0

Merci pour ça! Votre réponse m'a pensé à peu plus de choses sur le sujet. –