Cómo extraer letras mayúsculas de una cadena antes del número en R
Tengo un dataframe con cadenas de texto en una columna. ¿Cómo puedo extraer solo las subcadenas en mayúsculas antes de un número y agregarlas a otra columna? Un ejemplo es para DE, pero hay muchas más abreviaturas de países y siempre aparecen antes de un número.
TD<-data.frame(a=c("WHATEVERDE 11111","","Whatever DE 11111","DE 11111",""),
b=c("","What DE EverDE 1111","","",""),
c=c("Whatever","","","","WhateverDE 11111"))
Y me gustaría crear otra columna de la siguiente manera:
> TD
a b c result
1 WHATEVERDE 11111 Whatever DE
2 What DE EverDE 1111 DE
3 Whatever DE 11111 DE
4 DE 11111 DE
5 WhateverDE 11111 DE
Intenté aplicar la solución:
sub("^([[:alpha:]]*).*", "\\1", "DE 11111") pero no es universal.
Vector con abreviaturas:
names<-c('AT','BE','DE','BG','CZ','DK','FR','GR','ES','NL','HU','GB','IT')
davy.ai
Una posible solución utilizando los paquetes
tidyr
ystringr
es:“`{r}
library(tidyr)
library(stringr)
crear una nueva columna con las subcadenas en mayúsculas antes de un número
TD$resultado <- str_extract(TD$a, paste(nombres, collapse = “|”)) # usar el vector creado con las abreviaturas de país
TD$resultado <- toupper(TD$resultado) # convertir a mayúsculas
separar la nueva columna en dos, una con la subcadena extraída y otra con el texto restante
TD <- separate(TD, resultado, into = c(“resultado”, “a”), sep = “(?<=[A-Z])(?=[0-9])”, remove = FALSE)
seleccionar solo las columnas de interés en el orden deseado
TD <- TD[, c(“a”, “b”, “c”, “resultado”)]
1 WHATEVERDE 11111 Whatever DE
2 What DE EverDE 1111 DE
3 Whatever DE 11111 DE
4 DE 11111 DE
5 WhateverDE 11111 DE
“`
Explicación:
str_extract(TD$a, paste(nombres, collapse = "|"))
busca cualquiera de las abreviaturas de país en la columnaTD$a
y devuelve la primera coincidencia (que es la subcadena en mayúsculas antes de un número).toupper()
convierte la subcadena extraída a mayúsculas.separate()
divide la nueva columna en dos basándose en la posición antes del primer dígito, utilizando una expresión regular de lookbehind y lookahead (consulte?regex
para obtener más información). El argumentoremove
se establece enFALSE
para que la columna original no se elimine.[, c("a", "b", "c", "resultado")]
.