将purrr :: map应用于每个字符向量

时间:2018-01-08 04:31:37

标签: r list dataframe purrr

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

这是一个玩具示例

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

make_df <- function(x){
    data.frame(r1 = rnorm(1:5), r2 = rnorm(1:5), an = x)
}

这是make_df

> 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

现在,我想为每只动物运行此函数并将每个数据帧保存到列表中,并将该列表放在一个新数据框中,其中一列是动物,一列是数据框列表(我是ll与其他tidyverse函数一起使用)。

我认为这样做的方式就像 data.frame(animals = animals) %>% mutate(ldf = map(animals, make_df(.)))

 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)

当然,我可以使用lapply

创建此数据框列表
dfs <- lapply(animals, make_df)

但是如果我尝试将dfs和animals绑定到一个数据框中,我会得到一个看似相关的错误,同样关于不同的行数。

 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)
显然,我在这里缺少一些基本的东西。为什么我无法手动将字符列表和数据框列表组合到一个数据框中,以及如何误用purrr::map以便R遇到问题,大概是在我的函数中尝试做同样的事情。

1 个答案:

答案 0 :(得分:3)

您的语法有点偏离,您要么使用map(animals, make_df)要么map(animals, ~ make_df(.))map的第二个参数需要是一个函数,它与{{ 1}}:

lapply

或者如果使用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来创建列表类型列:

I