Eliminando las partes parcialmente superpuestas de 2 vectores en R
Me pregunto si sería posible eliminar las partes en el vector de caracteres n1
que se solapan parcialmente con los elementos en la fórmula f1
.
Por ejemplo, en n1
, vemos "study_typecompare"
y "study_typecontrol"
que se solapan parcialmente con study_type
en f1
.
Por lo tanto, en el desired_output
, queremos eliminar la parte "study_type"
de ellos. Debido a que otros elementos (por ejemplo, time_wk_whn
) en n1
se solapan completamente con un elemento en f1
, los dejamos sin cambios.
¿Es posible obtener mi desired_output
en BASE R o tidyverse?
f1 <- gi ~ 0 + study_type + time_wk_whn + time_wk_btw + items_whn +
items_btw + training_hr_whn + training_hr_btw
n1 <- c("study_typecompare","study_typecontrol","time_wk_whn",
"time_wk_btw","items_whn","items_btw","training_hr_whn",
"training_hr_btw")
desired_output <- c("compare","control", "time_wk_whn",
"time_wk_btw","items_whn","items_btw",
"training_hr_whn","training_hr_btw")
davy.ai
Sí, es posible obtener la salida deseada utilizando funciones de manipulación de cadenas en R. Una forma de lograr esto es utilizando el paquete
stringr
de la coleccióntidyverse
.Aquí hay una solución posible:
“`{r}
library(stringr)
extraer los elementos de la fórmula de f1
elementos_formula <- str_extract_all(f1, “\w+”)
identificar los elementos superpuestos en n1 usando str_detect
elementos_superpuestos <- str_detect(n1, paste0(“\b”, elementos_formula, “\b”, collapse=”|”))
reemplazar los elementos superpuestos con sus partes no superpuestas
n1[elementos_superpuestos] <- str_replace(n1[elementos_superpuestos],
paste0(“\b”, elementos_formula[elementos_superpuestos], “\b”),
“”)
eliminar cualquier guion bajo o espacio al principio/fin que quede
n1 <- str_trim(str_replace_all(n1, “_+”, ” “))
ver la salida final
n1
[1] “compare” “control” “time_wk_whn” “time_wk_btw”
[5] “items_whn” “items_btw” “training_hr_whn” “training_hr_btw”
“`
Explicación:
str_extract_all(f1, "\\w+")
extrae todos los caracteres alfanuméricos (palabras) def1
.paste0("\\b", elementos_formula, "\\b", collapse="|")
crea una expresión regular que coincide con cualquiera de los elementos de la fórmula (solo palabras completas), con|
separándolos.str_detect(n1, ...)
verifica cada elemento den1
para ver si coincide con la expresión regular creada anteriormente.str_replace(n1[elementos_superpuestos], ..., "")
elimina las partes superpuestas de cada elemento den1
que coincide con la expresión regular.str_trim()
elimina cualquier espacio al principio/fin de cada elemento den1
.str_replace_all(n1, "_+", " ")
reemplaza cualquier guion bajo restante por espacios (solo con fines de formato).Tenga en cuenta que esta solución asume que las partes no superpuestas de los elementos superpuestos están separadas por guiones bajos. Si este no es el caso, es posible que sea necesario ajustar la expresión regular en la función
str_replace()
en consecuencia.