在每个字符向量上应用purrr::map

在每个字符向量上应用purrr::map,r,list,dataframe,purrr,R,List,Dataframe,Purrr,我正在努力更好地理解purr::map函数。假设我有一个简单的字符向量,我想运行一些函数,使用每个字符作为输入输出一个数据帧 这里有一个玩具的例子 animals <- c('sheep', 'cow', 'horse') make_df <- function(x){ data.frame(r1 = rnorm(1:5), r2 = rnorm(1:5), an = x) } 现在,我想为每个动物运行这个函数,并将每个数据帧保存到一个列表中,然后将该列表放入一个新的数据

我正在努力更好地理解purr::map函数。假设我有一个简单的字符向量,我想运行一些函数,使用每个字符作为输入输出一个数据帧

这里有一个玩具的例子

animals <- c('sheep', 'cow', 'horse')

make_df <- function(x){
    data.frame(r1 = rnorm(1:5), r2 = rnorm(1:5), an = x)
}
现在,我想为每个动物运行这个函数,并将每个数据帧保存到一个列表中,然后将该列表放入一个新的数据帧中,其中一列是动物,一列是数据帧列表,我将与其他tidyverse函数一起使用

我认为这样做的方式应该是 data.frameanimals=animals%>%mutateDF=mapanimals,make_df

但这给了我一个错误

当然,我可以用lappy制作这个数据帧列表


很明显,我在这里遗漏了一些基本的东西。为什么我不能手动将字符列表和数据帧列表合并到一个数据帧中,我如何滥用purr::map使R遇到问题,可能是在我的函数中试图这样做。

您的语法有点错误,您可以使用mapanimals,make_-df或mapanimals,~make_-df。,map的第二个参数需要是一个函数,与lappy相同:


您的语法有点不正确,您可以使用mapanimals、make_df或mapanimals、~make_df.,map的第二个参数需要是一个函数,与lappy相同:

> make_df('sheep')
r1          r2           an
-0.18069698 -0.4767575  sheep
0.09580225  0.2785548   sheep
-0.74701529 0.2673391   sheep
-1.62795239 1.0026010   sheep
0.36573951  -0.2323944  sheep
 data.frame(animals = animals) %>% mutate(ldf = map(animals, make_df(.)))
Error in mutate_impl(.data, dots): Evaluation error: arguments imply differing number of rows: 5, 3. Traceback:

1. data.frame(animals = animals) %>% mutate(ldf = map(animals, make_df(.)))
2. withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
3. eval(quote(`_fseq`(`_lhs`)), env, env)
4. eval(quote(`_fseq`(`_lhs`)), env, env)
5. `_fseq`(`_lhs`)
6. freduce(value, `_function_list`)
7. withVisible(function_list[[k]](value))
8. function_list[[k]](value)
9. mutate(., ldf = map(animals, make_df(.)))
10. mutate.data.frame(., ldf = map(animals, make_df(.)))
11. as.data.frame(mutate(tbl_df(.data), ...))
12. mutate(tbl_df(.data), ...)
13. mutate.tbl_df(tbl_df(.data), ...)
14. mutate_impl(.data, dots)
dfs <- lapply(animals, make_df)
 data.frame(animals, dfs)
Error in data.frame(animals, dfs): arguments imply differing number of rows: 3, 5 Traceback:

1. data.frame(animals, dfs)
2. stop(gettextf("arguments imply differing number of rows: %s",   .     paste(unique(nrows), collapse = ", ")), domain = NA)
data.frame(animals) %>% mutate(ldf = map(animals, make_df)) %>% as.tibble()
# A tibble: 3 x 2
#  animals                  ldf
#   <fctr>               <list>
#1   sheep <data.frame [5 x 3]>
#2     cow <data.frame [5 x 3]>
#3   horse <data.frame [5 x 3]>

data.frame(animals) %>% mutate(ldf = map(animals, ~ make_df(.))) %>% as.tibble()
# A tibble: 3 x 2
#  animals                  ldf
#   <fctr>               <list>
#1   sheep <data.frame [5 x 3]>
#2     cow <data.frame [5 x 3]>
#3   horse <data.frame [5 x 3]>
data.frame(animals, ldf = I(lapply(animals, make_df)))
#                         ^