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

将data.frame中的所有列转换为字符,r,dataframe,tidyverse,R,Dataframe,Tidyverse,考虑一个混合了多种数据类型的data.frame 出于一个奇怪的目的,用户需要将所有列转换为字符。 怎样做最好?tidyverse尝试的解决方案是: map(mtcars,as.character) %>% map_df(as.list) %>% View() c2<-map(mtcars,as.character) %>% map_df(as.list) map(mtcars,as.character)%%>%map\u df(as.list)%%>%View() c

考虑一个混合了多种数据类型的data.frame

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

map(mtcars,as.character) %>% map_df(as.list) %>% View()
c2<-map(mtcars,as.character) %>% map_df(as.list)
map(mtcars,as.character)%%>%map\u df(as.list)%%>%View()
c2%地图测向(如列表所示)
当我调用
str(c2)
时,它应该是一个包含所有字符的tibble或data.frame


另一个选项是为
write.csv()
或在
write\u csv()
中进行一些参数设置,以在生成的文件输出中实现相同的效果。

这可能会起作用,但不确定是否是最好的

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

编辑:2021-03-01

从dplyr 1.0.0开始,取代了
\u all()
函数变体。实现这一点的新方法是使用新的
cross()
函数

库(dplyr)
mtcars%>%
变异(跨越(所有内容(),如.character))
使用
cross()
,我们选择要修改的列集(这里我们使用
everything()
选择所有列),然后指定要应用于每个选定列的函数。在本例中,即
as.character()

原始答案:

x[] <- lapply(x, as.character)
您还可以使用
dplyr::mutate\u all

库(dplyr)
mtcars%>%
全部变异(如字符)

以R为底:

x[] <- lapply(x, as.character)
在下面的第二种情况下,保留
示例
属性:

# Destroys attributes

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

# Preserves attributes

x[] <- lapply(x, as.character)
attributes(x)
#销毁属性
数据帧(lappy(x,as.character))%>%
属性()
#保留属性

x[]使用
数据表的最有效方法-

data.table::setDT(mtcars)
mtcars[, (colnames(mtcars)) := lapply(.SD, as.character), .SDcols = colnames(mtcars)]
注意:您可以使用它将
数据表的少数列转换为所需的列类型

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

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

to\u col\u type
在接受的答案中,所有的
都是变异的

您可以将
mutate()
函数用于:


我认为这可以简化为
x[]这是最好的答案,因为它保留了data.frame的属性@Sam有什么理由不按照sindri的建议简单点吗?很好,我已经用这个更简单的答案更新了答案command@sindri_baldur请您澄清一下
x[]@vasili111是如何看到的,谢谢!我已经更新了我的答案,以反映更新的dplyr语法。
library(dplyr)

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