Преобразование всех столбцов в символы в data.frame

Рассмотрим файл данных с комбинацией типов данных.

Для странной цели пользователю необходимо преобразовать все столбцы в символы. Как это лучше всего сделать? Типичная попытка решения заключается в следующем:

map(mtcars,as.character) %>% map_df(as.list) %>% View()
c2<-map(mtcars,as.character) %>% map_df(as.list)

когда я вызываю str(c2), он должен указывать тип или файл данных со всеми символами.

Другой вариант - это некоторые параметры параметров для write.csv() или write_csv(), чтобы добиться того же результата в результирующем выходе файла.

Ответ 1

Вы также можете использовать dplyr::mutate_all.

library(dplyr)
mtcars %>%
  mutate_all(as.character)

Ответ 2

mutate_all и повторное кадрирование data.frame после lapply приведет к изменению атрибутов data.frame. Если вам нужно сохранить row.names, метки или другие атрибуты, связанные с базовым data.frame, попробуйте:

x[, ] <- lapply(x[, ], as.character)

Это преобразует столбцы в класс символов на месте, сохраняя атрибуты data.frame.

Пример

x <- mtcars
attr(x, "example") <- "1"

Только в последнем случае ниже сохраняется атрибут example:

x %>%
  mutate_all(as.character) %>%
  attributes()

data.frame(lapply(x, as.character)) %>%
  attributes()

x[, ] <- lapply(x[, ], as.character)
attributes(x)

Обратите внимание, что если ваш вход когда-либо является одним столбцом data.frame, x[, ] возвращает вектор, а не файл data.frame. Чтобы устранить это, см. Как извлечь один столбец из data.frame в качестве data.frame?.

Ответ 3

Наиболее эффективный способ использования data.table -

data.table::setDT(mtcars)
mtcars[, (colnames(mtcars)) := lapply(.SD, as.character), .SDcols = colnames(mtcars)]

Примечание. Это можно использовать для преобразования нескольких столбцов data table в нужный тип столбца.

Если мы хотим преобразовать все столбцы в символы, мы также можем сделать что-то вроде this-

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

Это может сработать, но не уверен, что это лучше.

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