r - Convertir permanentemente varias columnas a numéricas - dplyr

CorePress2024-01-25  12

Seguí la solución dplyr aquí: convertir varias columnas de formato de caracteres a numérico en r para convertir varias columnas de caracteres a formato numérico.

El código

is_all_numeric <- function(x) 
{
  !any(is.na(suppressWarnings(as.numeric(na.omit(x))))) & is.character(x)
}
df %>%
   mutate_if(is_all_numeric,as.numeric) #%>%
   str()

funciona perfectamente. Sin embargo, si intento asignarlo al df (es decir, hacer cambios permanentes en el tipo de columna) usando

df <- df %>%
   mutate_if(is_all_numeric,as.numeric) #%>%
   str()

df se vuelve nulo. Por lo tanto, me pregunto qué está pasando y cómo hacer que los formatos numéricos sean permanentes usando estas líneas de código.

ERM

df <- tribble(~date, ~value,
        "2017-01-01", 1,
        "2017-01-02", 2,
        "2017-01-02", 3,
        "2017-01-03", 4,
        "2017-01-03", NA,
        "2017-01-04", 6,
        "2017-01-09", 9) %>% 
  arrange(date) %>% 
  mutate(to_date=cumsum(value))

No se puede reproducir el problema. ¿Puedes probar una nueva sesión de R?

-akrun

28/03/2021 a las 11:49



------------------------------------

Utilice esto en su lugar: cross no existía hace 7 años cuando se escribió el enlace en la pregunta:

df %>% mutate(across(.fns = type.convert))

o con solo base R:

replace(df, TRUE, lapply(df, type.convert))

2

Para ser justos, aunque la pregunta es antigua, tiene una respuesta más reciente

- Henrik

28/03/2021 a las 13:38

Sólo estaba señalando eso. type.convert es realmente el punto principal.

-G. Grothendieck

28/03/2021 a las 13:40



------------------------------------

Siga la respuesta de akruns, esto solo es una adición para explicar cuál es su problema.

Ten en cuenta que

df <- str(df)
df
NULL

Entonces, el error que estás experimentando es que copiaste una solución sin entender cada parte de ella.

Un buen consejo para buscar soluciones es

Pruebe y vea que funciona. Utilice "ayuda" para ver que each parte lo hace (preferiblemente cada parte). Intente ver si puede hacer otro pequeño ejemplo que indique que comprende cómo funciona.

En nuestro caso, podría usar ayuda("mutate_if") e inmediatamente indica que [ciclo de vida: Reemplazado], indicando que existe una implementación nueva y mejor (respuesta de akruns), y al leer no nota nada sospechoso (no NULL return), por lo que la siguiente parte es ayuda("str") o ayuda("%>%"). Y en el primero de ellos verás bajo retorno que

str no devuelve nada por motivos de eficiencia. El efecto secundario obvio se envía al terminal.

indicando que el problema está en esta función.

1

1

Gracias, de hecho subestimé el efecto de str. df<- df%>%mutate_if(is_all_numeric,as.numeric) funciona como una alternativa (reemplazada). La diferencia es que este código mantiene las columnas de cadena como caracteres, mientras que la sugerencia de G.Grothendiek de usar cross las convierte en factores.

- Magasinus

28/03/2021 a las 20:13

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare