Considérez un data.frame avec un mélange de types de données.
Dans un but étrange, un utilisateur doit convertir toutes les colonnes en caractères. Comment est-il préférable de le faire? Une tentative de solution bidirectionnelle est la suivante:
map(mtcars,as.character) %>% map_df(as.list) %>% View()
c2<-map(mtcars,as.character) %>% map_df(as.list)
quand j'appelle str(c2)
cela devrait dire un tibble ou data.frame avec tous les caractères.
L'autre option serait certains réglages de paramètres pour write.csv()
ou dans write_csv()
pour obtenir la même chose dans la sortie du fichier résultant.
Vous pouvez aussi utiliser dplyr::mutate_all
.
library(dplyr)
mtcars %>%
mutate_all(as.character)
mutate_all
et une nouvelle conversion de data.frame après lapply
entraînera la modification des attributs de data.frame. Si vous devez conserver row.names, labels ou autres attributs associés au data.frame sous-jacent, essayez:
x[, ] <- lapply(x[, ], as.character)
Cela convertit les colonnes en classe de caractères en place, en conservant les attributs de data.frame.
Exemple
x <- mtcars
attr(x, "example") <- "1"
Ce n'est que dans le dernier cas ci-dessous que l'attribut example
est conservé:
x %>%
mutate_all(as.character) %>%
attributes()
data.frame(lapply(x, as.character)) %>%
attributes()
x[, ] <- lapply(x[, ], as.character)
attributes(x)
Notez que si votre entrée est un data.frame à colonne unique, x[, ]
renverra un vecteur, pas un data.frame. Pour résoudre ce problème, voir Comment extraire une seule colonne d'un data.frame en tant que data.frame? .
La manière la plus efficace d'utiliser data.table
-
data.table::setDT(mtcars)
mtcars[, (colnames(mtcars)) := lapply(.SD, as.character), .SDcols = colnames(mtcars)]
Remarque: Vous pouvez l'utiliser pour convertir quelques colonnes d'un data table
au type de colonne souhaité.
Si nous voulons convertir toutes les colonnes en caractères, nous pouvons également faire quelque chose comme ça-
to_col_type <- function(col_names,type){
get(paste0("as.", type))(dt[[col_names]])
}
mtcars<- rbindlist(list(Map(to_col_type ,colnames(mtcars),"character")))
Cela pourrait fonctionner, mais je ne sais pas si c'est le meilleur.
df = data.frame(lapply(mtcars, as.character))
str(df)