使用 purrr 传递多个函数(每个函数一次)
Pass multiple functions (each one time) ussing purrr
我有一个包含不同文件的文件夹,每个文件都有不同的格式,因此我创建了能够读取每个文件的不同函数。是否可以使用map
将相应的功能应用于相应的文件?
我发现这个 可以将几个函数应用于对象,但我认为在这种情况下不适用,因为这里始终应用所有函数。
all_files <- list.dirs(file.path(path))
fun_A <- function(x) {read.csv(x)}
fun_B <- function(x) {read.table(x)}
fun_C <- function(x) {read.delim(x)}
funs <- c(fun_A , fun_B , fun_C)
因此,如果我手动执行它,它会起作用:
(all_files %>%
purrr::map(., ~list.files(., full.names = T)))[[1]][1] %>% fun_A() %>%
dplyr::bind_rows((all_files %>%
purrr::map(., ~list.files(., full.names = T)))[[1]][2] %>% fun_B ()) %>%
dplyr::bind_rows((all_files %>%
purrr::map(., ~list.files(., full.names = T)))[[1]][3] %>% fun_C())
但我用 purrr
尝试了几次,但我无法让它工作。这是我最后的尝试:
all_files %>% purrr::map(.x = ., ~{
df = (.x)
funs %>% purrr::map(., ~ df %>% (.))
})
有什么建议吗?
您可以按照@akrun
的建议使用Map
或map2
do.call(rbind, Map(function(x, y) y(x), all_files, funs))
使用map2_df
:
purrr::map2_df(all_files, funs, ~.y(.x))
要实现这一点,预计 length(all_files)
和 length(funs)
是相等的。
我有一个包含不同文件的文件夹,每个文件都有不同的格式,因此我创建了能够读取每个文件的不同函数。是否可以使用map
将相应的功能应用于相应的文件?
我发现这个
all_files <- list.dirs(file.path(path))
fun_A <- function(x) {read.csv(x)}
fun_B <- function(x) {read.table(x)}
fun_C <- function(x) {read.delim(x)}
funs <- c(fun_A , fun_B , fun_C)
因此,如果我手动执行它,它会起作用:
(all_files %>%
purrr::map(., ~list.files(., full.names = T)))[[1]][1] %>% fun_A() %>%
dplyr::bind_rows((all_files %>%
purrr::map(., ~list.files(., full.names = T)))[[1]][2] %>% fun_B ()) %>%
dplyr::bind_rows((all_files %>%
purrr::map(., ~list.files(., full.names = T)))[[1]][3] %>% fun_C())
但我用 purrr
尝试了几次,但我无法让它工作。这是我最后的尝试:
all_files %>% purrr::map(.x = ., ~{
df = (.x)
funs %>% purrr::map(., ~ df %>% (.))
})
有什么建议吗?
您可以按照@akrun
的建议使用Map
或map2
do.call(rbind, Map(function(x, y) y(x), all_files, funs))
使用map2_df
:
purrr::map2_df(all_files, funs, ~.y(.x))
要实现这一点,预计 length(all_files)
和 length(funs)
是相等的。