将所有列转换为 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))
考虑一个包含多种数据类型的 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))