将所有列转换为 data.frame 中的字符

Convert all columns to characters in a data.frame

考虑一个包含多种数据类型的 data.frame。

出于奇怪的目的,用户需要将所有列转换为字符。 怎么做最好?解决方案的 tidyverse 尝试是这样的:

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

当我调用 str(c2) 时,它应该说出所有字符的小标题或 data.frame。

另一个选项是 write.csv()write_csv() 中的一些参数设置,以在生成的文件输出中实现相同的目的。

这可能有用,但不确定它是否是最好的。

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

编辑:2021-03-01

从 dplyr 1.0.0 开始,_all() 函数变体被取代。完成此任务的新方法是使用新的 across() 函数。

library(dplyr)
mtcars %>%
  mutate(across(everything(), as.character))

across(),我们使用tidyselect helpers选择我们要修改的列集(这里我们使用everything()选择所有列),然后指定我们想要的函数应用于每个选定的列。在这种情况下,即 as.character().

原回答:

您也可以使用dplyr::mutate_all

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

在基数 R 中:

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

这会将列转换为字符 class,并保留 data.frame 的属性。调用 data.frame() 会导致它们丢失。

使用 dplyr 保存属性:dplyr::mutate(across(everything(), as.character)) 期间似乎保留了属性。之前它们被 dplyr::mutate_all.

摧毁了

例子

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

下面第二种情况,example属性被保留:

# Destroys attributes

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

# Preserves attributes

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

使用 data.table-

的最有效方法
data.table::setDT(mtcars)
mtcars[, (colnames(mtcars)) := lapply(.SD, as.character), .SDcols = colnames(mtcars)]

注意:您可以使用它来将 data table 的几列转换为您想要的列类型。

如果我们想将所有列都转换为字符,那么我们也可以这样做-

to_col_type <- function(col_names,type){
            get(paste0("as.", type))(dt[[col_names]])
            }
mtcars<- rbindlist(list(Map(to_col_type ,colnames(mtcars),"character")))

mutate_all 在接受的答案中是 superseded.

您可以将 mutate() 函数与 across() 一起使用:

library(dplyr)

mtcars %>% 
  mutate(across(everything(), as.character))