将data.frame中的所有列转换为字符
考虑一个混合了多种数据类型的data.frame 出于一个奇怪的目的,用户需要将所有列转换为字符。 怎样做最好?tidyverse尝试的解决方案是:将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
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))