web-dev-qa-db-fra.com

Convertir toutes les colonnes en caractères dans un data.frame

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.

20
userJT

Vous pouvez aussi utiliser dplyr::mutate_all.

library(dplyr)
mtcars %>%
  mutate_all(as.character)
36
Jake Thompson

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? .

12
Sam Firke

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")))
4
Rushabh Patel

Cela pourrait fonctionner, mais je ne sais pas si c'est le meilleur.

df = data.frame(lapply(mtcars, as.character))
str(df)
3
Sean Lin