如何在purrr映射中传递数据帧和不均匀向量作为参数

时间:2017-10-24 04:52:27

标签: r dplyr purrr

我有一个混合数据类型的函数。它将数据框和字符串变量作为输入参数。


b = 2 * a

但我想用矢量列表

来应用它
library(dplyr)


myfunc <- function (dat=NULL,species=NULL,sepal_thres=NULL) {
 dat %>% 
    filter(Species==species & Sepal.Length <= sepal_thres) 

}

myfunc(dat=iris,species="virginica",sepal_thres=5)
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
#> 1          4.9         2.5          4.5         1.7 virginica

我收到了这个错误:

species_vecs <- c("virginica","setosa")
sepal_thres_vecs <- c(5, 6)
purrr::pmap(list(dat=iris, species=species_vecs, sepal_thres=sepal_thres_vecs), myfunc)

这样做的正确方法是什么?

并非Error: Element 2 has length 2, not 1 or 5. species参数来自此组合:

sepal_tres

> expand.grid(species_vecs,sepal_thres_vecs) %>% rename(species=Var1, sepal_thres=Var2) species sepal_thres 1 virginica 5 2 setosa 5 3 virginica 6 4 setosa 6 作为参数已修复。

3 个答案:

答案 0 :(得分:2)

如果你有一个长度为1的元素作为较大列表的一部分,

pmap将使用回收。在这种情况下,您可以将iris作为列表元素传递到完整列表中,以将其用于每个物种 - 萼片组合。

请注意pmap按照它们出现的顺序浏览具有多个值的列表元素。如果你想在pmap中想要物种和萼片向量的每一个组合,你需要创建并给出完整的向量作为列表元素(即,你必须自己进行交叉)。

purrr::pmap(list(dat = list(iris), species = rep(species_vecs, 2), 
                 sepal_thres = rep(sepal_thres_vecs, each = 2) ), myfunc)

[[1]]
  Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
1          4.9         2.5          4.5         1.7 virginica

[[2]]
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           4.9         3.0          1.4         0.2  setosa
2           4.7         3.2          1.3         0.2  setosa
3           4.6         3.1          1.5         0.2  setosa
4           5.0         3.6          1.4         0.2  setosa
5           4.6         3.4          1.4         0.3  setosa
6           5.0         3.4          1.5         0.2  setosa
...

答案 1 :(得分:1)

您可以使用此解决方案:

expand.grid(species_vecs,sepal_thres_vecs) %>% 
  rename(species=Var1, sepal_thres=Var2) %>% 
  as.tibble() %>% 
  mutate(sum = map2(as.character(species), sepal_thres,myfunc,dat = iris)) %>% 
  unnest(sum)

答案 2 :(得分:1)

您可以使用Vectorize

input <- expand.grid(species_vecs,sepal_thres_vecs,stringsAsFactors = F) %>% rename(species=Var1, sepal_thres=Var2)
#     species sepal_thres
# 1 virginica           5
# 2    setosa           5
# 3 virginica           6
# 4    setosa           6
output <- Vectorize(myfunc,c("species","sepal_thres"),SIMPLIFY=F)(dat=iris,species=input[[1]],sepal_thres=input[[2]])
output[[1]]
#   Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
# 1          4.9         2.5          4.5         1.7 virginica
output[[3]]
# Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
# 1          5.8         2.7          5.1         1.9 virginica
# 2          4.9         2.5          4.5         1.7 virginica
# 3          5.7         2.5          5.0         2.0 virginica
# 4          5.8         2.8          5.1         2.4 virginica
# 5          6.0         2.2          5.0         1.5 virginica
# 6          5.6         2.8          4.9         2.0 virginica
# 7          6.0         3.0          4.8         1.8 virginica
# 8          5.8         2.7          5.1         1.9 virginica
# 9          5.9         3.0          5.1         1.8 virginica