考虑具有混合数据类型的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()
的一些参数设置,以便在生成的文件输出中实现相同的功能。
答案 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_all
是 superseded。
您可以将 mutate()
函数与 across()
一起使用:
library(dplyr)
mtcars %>%
mutate(across(everything(), as.character))