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 :
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 >
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), "-"))
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"
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) code>, 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.
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"
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"
Supprimez une partie de la chaîne après "." , Obtenez les chaînes avant la virgule avec R , Extraire une partie de la chaîne (jusqu'au premier point-virgule) dans R , Comment tout extraire jusqu'à la première occurrence du motif