regex - sheet - str_detect r
gsub devuelve una cadena vacĂa cuando no se encuentra ninguna coincidencia (5)
Probablemente iré por una ruta diferente, ya que el sapply
no me parece necesario ya que estas funciones ya están vectorizadas:
fun <- function(x){
ind <- grep(".*(Ref. (//d+)).*",x,value = FALSE)
x <- gsub(".*(Ref. (//d+)).*", "//1", x)
x[-ind] <- ""
x
}
fun(data)
Estoy usando la función gsub
en R para devolver las apariciones de mi patrón (números de referencia) en una lista de texto. Esto funciona muy bien a menos que no se encuentre una coincidencia, en cuyo caso recupero toda la cadena, en lugar de una cadena vacía. Considera el ejemplo:
data <- list("a sentence with citation (Ref. 12)",
"another sentence without reference")
sapply(data, function(x) gsub(".*(Ref. (//d+)).*", "//1", x))
Devoluciones:
[1] "Ref. 12" "another sentence without reference"
Pero me gustaría obtener
[1] "Ref. 12" ""
¡Gracias!
Puede probar incrustando grep( ..., value = T)
en esa función.
data <- list("a sentence with citation (Ref. 12)",
"another sentence without reference")
unlist( sapply(data, function(x) {
x <- gsub(".*(Ref. (//d+)).*", "//1", x)
grep( "Ref//.", x, value = T )
} ) )
Es algo voluminoso pero funciona? También elimina la segunda referencia vacía.
de acuerdo con la documentación, esta es una función de gsub
que devuelve la cadena de entrada si no hay coincidencias con las coincidencias de patrón suministradas devuelve la cadena completa.
aquí, utilizo la función grepl
primero para devolver un vector lógico de la presencia / ausencia del patrón en la cadena dada:
ifelse(grepl(".*(Ref. (//d+)).*", data),
gsub(".*(Ref. (//d+)).*", "//1", data),
"")
incrustado esto en una función:
mygsub <- function(x){
ans <- ifelse(grepl(".*(Ref. (//d+)).*", x),
gsub(".*(Ref. (//d+)).*", "//1", x),
"")
return(ans)
}
mygsub(data)
xs <- sapply(data, function(x) gsub(".*(Ref. (//d+)).*", "//1", x))
xs[xs==data] <- ""
xs
#[1] "Ref. 12" ""
Pruebe strapplyc
en el paquete gsubfn:
library(gsubfn)
L <- fn$sapply(unlist(data), ~ strapplyc(x, "Ref. //d+"))
unlist(fn$sapply(L, ~ ifelse(length(x), x, "")))
que le da esto:
a sentence with citation (Ref. 12) another sentence without reference
"Ref. 12" ""
Si no le importa la salida de la lista, puede usar L y olvidarse de la última línea de código. Tenga en cuenta que el prefijo fn$
convierte los argumentos de la fórmula de la función aplicada en llamadas a funciones para que la primera línea de código pueda escribirse sin fn
como sapply(unlist(data), function(x) strapplyc(x, "Ref x. //d+"))
.