Ответ 1
Вы также можете использовать dplyr::mutate_all
.
library(dplyr)
mtcars %>%
mutate_all(as.character)
Рассмотрим файл данных с комбинацией типов данных.
Для странной цели пользователю необходимо преобразовать все столбцы в символы. Как это лучше всего сделать? Типичная попытка решения заключается в следующем:
map(mtcars,as.character) %>% map_df(as.list) %>% View()
c2<-map(mtcars,as.character) %>% map_df(as.list)
когда я вызываю str(c2)
, он должен указывать тип или файл данных со всеми символами.
Другой вариант - это некоторые параметры параметров для write.csv()
или write_csv()
, чтобы добиться того же результата в результирующем выходе файла.
Вы также можете использовать dplyr::mutate_all
.
library(dplyr)
mtcars %>%
mutate_all(as.character)
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?.
Наиболее эффективный способ использования 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")))
Это может сработать, но не уверен, что это лучше.
df = data.frame(lapply(mtcars, as.character))
str(df)