es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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")
Tags:  , , ,

Answer

  1. Avatar for 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ón tidyverse.

    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


    Esto produce el resultado deseado:

    [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) de f1.
    • 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 de n1 para ver si coincide con la expresión regular creada anteriormente.
    • str_replace(n1[elementos_superpuestos], ..., "") elimina las partes superpuestas de cada elemento de n1 que coincide con la expresión regular.
    • str_trim() elimina cualquier espacio al principio/fin de cada elemento de n1.
    • 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.

Comments are closed.