1
votes

extraction de données avant une connexion R

J'ai besoin d'extraire tout le texte avant un signe, dans ce cas un tiret. J'ai des données comme celles-ci:

extract1 <- "Médicos"
extract2 <- "Disturbio"
extract3 <- "Accidente"

Le problème est que les mots que j'essaie d'extraire n'ont pas la même longueur, donc je ne peux pas en essayer certains

XXX

les résultats souhaités sont:

extract <- substring(text1, 1, n)


4 Réponses :


1
votes

Vous pouvez utiliser des expressions régulières:

text1 <-  "Médicos-Otros"
text2 <-  "Disturbio-Escándalo"
text3 <-  "Accidente-Choque"

extract1 <- gsub("\\-.*", "", text1)
extract2 <- gsub("\\-.*", "", text2)
extract3 <- gsub("\\-.*", "", text3)

Cela se traduit par correspondre à tout (y compris) après le tiret ("-") et remplacer par rien "".

p >


2 commentaires

Merci. Maintenant, j'ai besoin d'extraire la deuxième partie du texte. Comment puis-je le faire?


@ ArmandoGonzálezDíaz: Si vous êtes intéressé par les deux parties de chaque chaîne, mais en les séparant, vous feriez mieux d'utiliser l'approche Jilbers strsplit () . Par exemple: do.call (rbind, strsplit (c (text1, text2, text3), "-"))



1
votes

Utiliser sub fait le travail:

sub(".*-(.*)", "\\1", c(text1, text2, text3))
# [1] "Otros"     "Escándalo" "Choque"   

Ici, nous divisons chaque caractère en: ce qui précède le tiret ( (. *) code >), le tiret lui-même et ce qui suit le tiret (. * ). Chaque caractère est alors remplacé par la première partie ( \\ 1 ).

De manière analogue, vous pouvez extraire la seconde moitié:

sub("(.*)-.*", "\\1", c(text1, text2, text3))
# [1] "Médicos"   "Disturbio" "Accidente"


2 commentaires

Merci. Une dernière chose, juste pour comprendre comment cela fonctionne: s'il y avait beaucoup de tirets et que j'en ai besoin d'un en particulier ¿Comment puis-je obtenir la partie de texte souhaitée?


@ ArmandoGonzálezDíaz, pour extraire, disons, la 5ème partie (après le 4ème tiret), utilisez sub ("(. *? -) {4} (. *?) ($ | -. *)", "\ \ 2 ", txt) , et ainsi de suite (il suffit de remplacer {4} par autre chose). Le modèle est maintenant assez différent car le nombre total de tirets est inconnu. Si vous saviez qu'il y a quatre tirets au total, la cinquième partie serait sub (". * -. * -. * -. * - (. *)", "\\ 1", txt) , si nous continuons de la même manière, mais il y a clairement des moyens plus concis une fois que la situation devient plus complexe. Pour l'avenir, gardez à l'esprit que votre question initiale comprend tout.



1
votes

Vous pouvez également utiliser strsplit

> library(stringr)
> str_extract(c(text1, text2, text3), "\\w+")
[1] "Médicos"   "Disturbio" "Accidente"

Considérez str_extract du package stringr comme une autre alternative

> sapply(strsplit(c(text1, text2, text3), "-"), "[[", 1)
[1] "Médicos"   "Disturbio" "Accidente"


0 commentaires

0
votes

Utilisation de regex avec anticipation positive

sapply(c(text1, text2, text3), 
  function(x)
    regmatches(x, regexpr(".*(?=-)", x, perl=TRUE))
)
#      Médicos-Otros Disturbio-Escándalo    Accidente-Choque 
#          "Médicos"         "Disturbio"         "Accidente" 


0 commentaires