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