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.

Tidyverse: Coincidir palabra en cadena con lista de palabras clave

Estoy tratando de escribir un código que verifique si una cadena contiene alguna palabra contenida en una lista de términos, con el fin de crear una nueva columna en el dataframe.

Esta es la lista de términos:

vehicles <- c('vehicle', 'mazda', 'nissan', 'ford', 'honda', 'chevrolet', 'toyota')

Ejemplos de las cadenas que estoy buscando son: “2001 honda civic”, “2003 nissan altima”, “2005 mazda 5”, etc. (estos son los valores de asset_name en el código a continuación).

Mi código simplificado se ve así:

df %>%
  mutate(
    asset_type = case_when(
      vehicles %in% asset_name == TRUE ~ 'vehicle', # esto no funciona, obviamente
      <código que="" funciona="" aquí!!!="">,
      TRUE ~ asset_name
    )
  )

He intentado utilizar str_detect, str_extract, grepl y una función personalizada, pero no logro hacer que funcione.

Sé que para cada entrada de asset_name, necesito recorrer la lista de vehículos para ver si uno de los modelos de vehículos está en asset_name, pero no logro hacerlo funcionar. ¡Grr…!

¡Gracias de antemano!</código>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr esto es utilizando la función str_detect del paquete stringr en combinación con la función map_lgl del paquete purrr. Así es como se puede hacer:

    “`{r}
    library(tidyverse)

    define la lista de vehículos

    vehicles <- c(‘vehicle’, ‘mazda’, ‘nissan’, ‘ford’, ‘honda’, ‘chevrolet’, ‘toyota’)

    ejemplo de marco de datos

    df <- tibble(asset_name = c(“2001 honda civic”, “2003 nissan altima”, “2005 mazda 5”))

    define una función que verifica si un término está presente en una cadena

    check_term <- function(string, term) { string %>% str_detect(term)
    }

    utiliza la función para crear un vector lógico que indica si alguno de los términos está presente en asset_name

    term_present <- map_lgl(df$asset_name, ~ any(vehicles %>% map(~ check_term(.x, .))) )

    utiliza case_when para asignar el tipo de activo apropiado a cada fila

    df %>%
    mutate(
    asset_type = case_when(
    term_present ~ ‘vehicle’,
    TRUE ~ asset_name
    )
    )
    “`

    Esto debería crear una nueva columna llamada asset_type con el valor 'vehicle' para filas donde alguno de los términos en la lista vehicles está presente en asset_name, y el valor original de asset_name para todas las demás filas.

Comments are closed.