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>
davy.ai
Una forma de lograr esto es utilizando la función
str_detect
del paquetestringr
en combinación con la funciónmap_lgl
del paquetepurrr
. 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 listavehicles
está presente enasset_name
, y el valor original deasset_name
para todas las demás filas.