Home > Blockchain >  Extract specific part of string in R works only for certain values
Extract specific part of string in R works only for certain values

Time:07-25

I am working with a dataframe of strings in R. My dataframe only has one column with a very large string (dput() added at end of post). My goal is to extract the text between __ and _. For that reason I coded next instructions:

#Extract
x1$Var<- gsub('\n\n','_',x1$Var)
x1$Extract<- gsub(".*[__]([^.] )[_].*", "\\1", x1$Var)

But it only works for the second row and not for the first. In my case Extract should be Silva Ayala, Henry Gabriel\n (UNAM - TOLUCA, 2020-03-19) and Cumbal Vargas, Kelly Salomé\n (ITAM - PUEBLA, 2020-03-18) but I am getting:

[1] "Modelo de gestión de riesgos para Compañías de Seguros domiciliadas en Ecuador"
[2] "Cumbal Vargas, Kelly Salomé\n (PUCE - Quito, 2021-03-18)" 

Maybe I am wrong with regex. Many thanks for your help, here is my data:

#Data
x1 <- structure(list(Var = c("\n\n\nModelo de gestión de riesgos para Compañías de Seguros domiciliadas en Mexico\n\n                    <U FEFF> \n                \n\n\n\nSilva Ayala, Henry Gabriel\n (UNAM - TOLUCA, 2020-03-19)\n\nModelo de gestión de riesgos para Compañías de Seguros domiciliadas en Mexico\n\n", 
"\n\n\nAnálisis de costos para la producción de leche en la Hacienda del Teca para el año 2020\n\n                    <U FEFF> \n                \n\n\n\nCumbal Vargas, Kelly Salomé\n (ITAM - PUEBLA, 2020-03-18)\n\nEl presente trabajo fue desarrollado en la Hacienda del Teca, propiedad dedicada a la\r\nproducción de leche.\r\nLa investigación se centró en la manera en la que la Hacienda costeaba el litro de leche, a\r\npartir de esto se ...\n\n"
)), row.names = 54:55, class = "data.frame")

New Data:

#Data 2
x3 <- structure(list(Var = c("\n\n\nModelo de gestión de riesgos para Compañías de Seguros domiciliadas en Mexico\n\n                    <U FEFF> \n                \n\n\n\nSilva Ayala, Henry Gabriel\n (UNAM - TOLUCA, 2020-03-19)\n\nModelo de gestión de riesgos para Compañías de Seguros domiciliadas en Mexico\n\n", 
"\n\n\nAnálisis de costos para la producción de leche en la Hacienda del Teca para el año 2020\n\n                    <U FEFF> \n                \n\n\n\nCumbal Vargas, Kelly Salomé\n (ITAM - PUEBLA, 2020-03-18)\n\nEl presente trabajo fue desarrollado en la Hacienda del Teca, propiedad dedicada a la\r\nproducción de leche.\r\nLa investigación se centró en la manera en la que la Hacienda costeaba el litro de leche, a\r\npartir de esto se ...\n\n", 
"\n\n\nDiseño de un sistema de gestión de la calidad basado en la norma Iso 9001:2008 para los procesos relacionados con el cliente en la empresa la Competencia S.A.\n\n                    <U FEFF> \n                \n\n\nCadena Echeverría, Jaime Luis Hermel* (ITAM, 2014)\n\nEn el presente trabajo se ha diseñado la documentación requerida para un sistema de\r\ngestión de la calidad basado en la Norma ISO 9001:2008 de los procesos relacionados con\r\nel cliente de la empresa La Competencia S.A., ...\n\n"
)), row.names = c(NA, -3L), class = "data.frame")

CodePudding user response:

We may need to place the __ outside the [] as the character will be literally evaluated as _ (it looks for each unique character within the [], thus if we have [_] or [__] or [___] or [_____] will all be evaluated as a single _

> gsub(".*[_]([^.] )[_].*", "\\1",gsub('\n\n','_',x1$Var))
[1] "Modelo de gestión de riesgos para Compañías de Seguros domiciliadas en Mexico"
[2] "Cumbal Vargas, Kelly Salomé\n (ITAM - PUEBLA, 2020-03-18)" 
> gsub(".*[___]([^.] )[_].*", "\\1",gsub('\n\n','_',x1$Var))
[1] "Modelo de gestión de riesgos para Compañías de Seguros domiciliadas en Mexico"
[2] "Cumbal Vargas, Kelly Salomé\n (ITAM - PUEBLA, 2020-03-18)"        

If we want to use the _ within the [], do it as

> gsub(".*[_]{2}([^_] )[_].*", "\\1",gsub('\n\n','_',x1$Var))
[1] "Silva Ayala, Henry Gabriel\n (UNAM - TOLUCA, 2020-03-19)" 
[2] "Cumbal Vargas, Kelly Salomé\n (ITAM - PUEBLA, 2020-03-18)"

Or can be

gsub(".*__([^_] )_.*", "\\1", gsub('\n\n','_',x1$Var))

-output

[1] "Silva Ayala, Henry Gabriel\n (UNAM - TOLUCA, 2020-03-19)"  
[2] "Cumbal Vargas, Kelly Salomé\n (ITAM - PUEBLA, 2020-03-18)"
  • Related