Estoy tratando de establecer un valor de columna dinámicamente creando una función y definiendo qué columna quiero crear y qué columna quiero evaluar a través de expresiones regulares. Hasta ahora, la función siguiente funciona cuando uso la construcción "ifelse". Pero no puedo pensar en una manera de omitir el "más" y dejar el valor de la columna si mi expresión regular no coincide.
Lo que quiero lograr es que también después de la segunda llamada a mi función "set_column_value_by_regex", los quattro-modelos, que coincidieron en mi primera llamada, todavía tengan el valor TRUE en la columna "four_wheel_drive". Actualmente esto se sobrescribe, como se ve en la salida.
library(tidyverse)
#> Warning: package 'dplyr' was built under R version 3.5.2
#> Warning: package 'stringr' was built under R version 3.5.2
set_column_value_by_regex <- function(my_dataframe,target_column,test_column,regex,value_true,value_false="") {
my_dataframe[[target_column]] <- ifelse(str_detect(my_dataframe[[test_column]],regex),yes = value_true, no = value_false)
return(my_dataframe)
}
new_mpg <- set_column_value_by_regex(mpg,"four_wheel_drive","model","quattro",TRUE,FALSE)
new_mpg <- set_column_value_by_regex(new_mpg,"four_wheel_drive","model","4wd",TRUE,FALSE)
new_mpg %>%
select(model,four_wheel_drive) %>%
distinct(model,.keep_all = TRUE) %>%
head()
#> # A tibble: 6 x 2
#> model four_wheel_drive
#> <chr> <lgl>
#> 1 a4 FALSE
#> 2 a4 quattro FALSE
#> 3 a6 quattro FALSE
#> 4 c1500 suburban 2wd FALSE
#> 5 corvette FALSE
#> 6 k1500 tahoe 4wd TRUE
Creado el 2020-10-25 por el paquete reprex (v0.2.0).
Esta es una especie de función inusual, y parece que podría hacerlo de una manera más sencilla. Pero solo responderé tu pregunta:
El problema no es su función, sino lo que está pasando a la función. En la segunda llamada, le dijo a la función que reemplazara el valor con FALSE si no coincidía, por lo que la función hizo lo que dijo. Si desea que mantenga el valor original, pase el valor original a la función. Al igual que:
library(tidyverse)
#> Warning: package 'dplyr' was built under R version 3.5.2
#> Warning: package 'stringr' was built under R version 3.5.2
set_column_value_by_regex <- function(my_dataframe,target_column,test_column,regex,value_true,value_false="") {
my_dataframe[[target_column]] <- ifelse(str_detect(my_dataframe[[test_column]],regex),yes = value_true, no = value_false)
return(my_dataframe)
}
new_mpg <- set_column_value_by_regex(mpg,"four_wheel_drive","model","quattro",TRUE,FALSE)
new_mpg <- set_column_value_by_regex(new_mpg,"four_wheel_drive","model","4wd",TRUE,new_mpg$four_wheel_drive)
new_mpg %>%
select(model,four_wheel_drive) %>%
distinct(model,.keep_all = TRUE) %>%
head()
# # A tibble: 6 x 2
# model four_wheel_drive
# <chr> <lgl>
# 1 a4 FALSE
# 2 a4 quattro TRUE
# 3 a6 quattro TRUE
# 4 c1500 suburban 2wd FALSE
# 5 corvette FALSE
# 6 k1500 tahoe 4wd TRUE
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras