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

时间:2017-05-04 17:28:18

标签: r dataframe tidyverse

考虑具有混合数据类型的data.frame。

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

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

当我致电str(c2)时,应该说出包含所有字符的tibble或data.frame。

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

5 个答案:

答案 0 :(得分:31)

您也可以使用dplyr::mutate_all

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

答案 1 :(得分:8)

mutate_all并在lapply之后重新生成data.frame将导致data.frame的属性发生变化。如果需要保留与基础data.frame关联的row.names,labels或其他属性,请尝试:

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。要解决此问题,请参阅How do I extract a single column from a data.frame as a data.frame?

答案 2 :(得分:4)

使用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")))

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

接受的答案中的

mutate_allsuperseded

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

library(dplyr)

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