【问题标题】:How to pass a dataframe and uneven vectors as parameters in purrr map如何在 purrr 图中将数据帧和不均匀向量作为参数传递
【发布时间】:2017-10-24 04:52:26
【问题描述】:

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


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.

正确的做法是什么?

speciessepal_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

但是dat作为参数是固定的。

【问题讨论】:

    标签: r dplyr purrr


    【解决方案1】:

    pmap 将使用回收,如果你有一个长度为 1 的元素作为你更大的列表的一部分。在这种情况下,您可以将 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
    ...
    

    【讨论】:

      【解决方案2】:

      您可以使用此解决方案:

      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)
      

      【讨论】:

        【解决方案3】:

        你可以使用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
        

        【讨论】:

          猜你喜欢
          • 2020-05-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-03
          • 2015-12-26
          • 2017-12-16
          • 1970-01-01
          相关资源
          最近更新 更多