将 `as.character()` 函数应用于数据帧列表
Apply an `as.character()` function to a list of dataframes
所以基本上我有一个要应用 as.character()
的数据帧列表。
为了获取数据帧列表,我有一个文件列表,我使用 map()
函数和我创建的读取函数读取了这些文件。我不能使用 map_df()
因为有些列正在作为不同的数据类型读入。所有文件都是相同的,我知道如果需要,我可以在读取函数中对数据类型进行硬编码,但如果可以的话,我想避免这种情况。
此时我将数据帧列表放入 for 循环并应用另一个 map()
函数来应用 as.character()
函数。然后使用 bind_rows()
.
压缩最终的数据帧列表
总而言之,这似乎是一个非常复杂的过程,请参见下面的代码。
audits <- list.files()
my_reader <- function(x) {
my_file <- read_xlsx(x)
}
audits <- map(audits, my_reader)
for (i in 1:length(audits)) {
audits[[i]] <- map_df(audits[[i]], as.character)
}
audits <- bind_rows(audits)
有人对我如何改进它有任何想法吗?理想情况下,我可以在一个矢量化 map()
函数中完成所有事情?
为了可重复性,您可以使用两个 iris 数据集,其中一列数据类型已更改。
iris2 <- iris
iris2[1] <- as.character(iris2[1])
my_list <- list(iris, iris2)
as.character
适用于 vector
而 data.frame
是 vector
的 list
。如果我们只想使用一次 map
,一个选项是使用 across
library(dplyr)
library(purrr)
map_dfr(my_list, ~ .x %>%
mutate(across(everything(), as.character)))
我想展示一个基本的 R 解决方案,以防万一它对其他人有帮助。您可以使用 rapply
递归遍历列表并应用函数。你可以指定 class 如果你想替换或 unlist/list 返回的对象:
iris2 <- iris
iris2[1] <- as.character(iris2[1])
my_list <- list(iris, iris2)
mylist2 <- rapply(my_list, class = "ANY", f = as.character, how = "replace")
bigdf <- do.call(rbind, mylist2)
所以基本上我有一个要应用 as.character()
的数据帧列表。
为了获取数据帧列表,我有一个文件列表,我使用 map()
函数和我创建的读取函数读取了这些文件。我不能使用 map_df()
因为有些列正在作为不同的数据类型读入。所有文件都是相同的,我知道如果需要,我可以在读取函数中对数据类型进行硬编码,但如果可以的话,我想避免这种情况。
此时我将数据帧列表放入 for 循环并应用另一个 map()
函数来应用 as.character()
函数。然后使用 bind_rows()
.
总而言之,这似乎是一个非常复杂的过程,请参见下面的代码。
audits <- list.files()
my_reader <- function(x) {
my_file <- read_xlsx(x)
}
audits <- map(audits, my_reader)
for (i in 1:length(audits)) {
audits[[i]] <- map_df(audits[[i]], as.character)
}
audits <- bind_rows(audits)
有人对我如何改进它有任何想法吗?理想情况下,我可以在一个矢量化 map()
函数中完成所有事情?
为了可重复性,您可以使用两个 iris 数据集,其中一列数据类型已更改。
iris2 <- iris
iris2[1] <- as.character(iris2[1])
my_list <- list(iris, iris2)
as.character
适用于 vector
而 data.frame
是 vector
的 list
。如果我们只想使用一次 map
across
library(dplyr)
library(purrr)
map_dfr(my_list, ~ .x %>%
mutate(across(everything(), as.character)))
我想展示一个基本的 R 解决方案,以防万一它对其他人有帮助。您可以使用 rapply
递归遍历列表并应用函数。你可以指定 class 如果你想替换或 unlist/list 返回的对象:
iris2 <- iris
iris2[1] <- as.character(iris2[1])
my_list <- list(iris, iris2)
mylist2 <- rapply(my_list, class = "ANY", f = as.character, how = "replace")
bigdf <- do.call(rbind, mylist2)