【问题标题】:How to use purrr to apply function based on parameters made in a dataframe如何使用 purrr 根据数据框中的参数应用函数
【发布时间】:2017-07-08 03:55:38
【问题描述】:

我有以下代码:


library(MASS)
library(tidyverse)

# Get density of points in 2 dimensions.
# @param x A numeric vector.
# @param y A numeric vector.
# @param n Create a square n by n grid to compute density.
# @return The density within each square.
get_density <- function(x, y, n = 100) {
  dens <- MASS::kde2d(x = x, y = y, n = n)
  ix <- findInterval(x, dens$x)
  iy <- findInterval(y, dens$y)
  ii <- cbind(ix, iy)
  return(dens$z[ii])
}

dens_wrapper <- function (tbl=NULL, var1=NULL, var2=NULL) {
  tbl_pair <- tbl %>%
                select_(var1, var2)
  x <- tbl_pair %>% pull(var1)
  y <- tbl_pair %>% pull(var2)
  tbl_pair$density <- get_density(x,y)
  tbl_pair
}


tbl <- as.tibble(iris) %>% 
        select(-Species)

dens_wrapper(tbl=tbl, var1="Sepal.Length",var2="Petal.Length")
#> # A tibble: 150 x 3
#>    Sepal.Length Petal.Length    density
#>           <dbl>        <dbl>      <dbl>
#>  1          5.1          1.4 0.15253089
#>  2          4.9          1.4 0.15139758
#>  3          4.7          1.3 0.12566689
#>  4          4.6          1.5 0.10828077
#>  5          5.0          1.4 0.15624282
#>  6          5.4          1.7 0.10998006
#>  7          4.6          1.4 0.10773843
#>  8          5.0          1.5 0.15908618
#>  9          4.4          1.4 0.06635717
#> 10          4.9          1.5 0.15379367
#> # ... with 140 more rows

我正在尝试在参数集上使用dens_wrapper() 函数 由这个构造:

tbl_colnames <- colnames(tbl)
allcomb_var <- expand.grid(tbl_colnames, tbl_colnames)
allcomb_var
#>            Var1         Var2
#> 1  Sepal.Length Sepal.Length
#> 2   Sepal.Width Sepal.Length
#> 3  Petal.Length Sepal.Length
#> 4   Petal.Width Sepal.Length
#> 5  Sepal.Length  Sepal.Width
#> 6   Sepal.Width  Sepal.Width
#> 7  Petal.Length  Sepal.Width
#> 8   Petal.Width  Sepal.Width
#> 9  Sepal.Length Petal.Length
#> 10  Sepal.Width Petal.Length
#> 11 Petal.Length Petal.Length
#> 12  Petal.Width Petal.Length
#> 13 Sepal.Length  Petal.Width
#> 14  Sepal.Width  Petal.Width
#> 15 Petal.Length  Petal.Width
#> 16  Petal.Width  Petal.Width

使用此代码:

allcomb_var %>% 
  purrr:pmap(list(tbl=tbl, var1=Var1, var2=Var2), dens_wrapper)

但它给了我这个错误:

Error in as_function(.f, ...) : object 'Var1' not found

正确的做法是什么?


@baptise 解决方案给出了这个(不是我所期望的):

# A tibble: 2,400 x 5
   Sepal.Length    density Sepal.Width Petal.Length Petal.Width
          <dbl>      <dbl>       <dbl>        <dbl>       <dbl>
 1          5.1 0.35060831          NA           NA          NA
 2          4.9 0.32088818          NA           NA          NA
 3          4.7 0.23507822          NA           NA          NA
 4          4.6 0.18191675          NA           NA          NA
 5          5.0 0.34885589          NA           NA          NA
 6          5.4 0.32746528          NA           NA          NA
 7          4.6 0.18191675          NA           NA          NA
 8          5.0 0.34885589          NA           NA          NA
 9          4.4 0.09698895          NA           NA          NA
10          4.9 0.32088818          NA           NA          NA
# ... with 2,390 more rows

【问题讨论】:

    标签: r tidyverse purrr


    【解决方案1】:

    类似的东西?

    allcomb_var <- expand.grid(var1 = tbl_colnames, var2 = tbl_colnames,
                               stringsAsFactors = FALSE)
    
    allcomb_var %>% 
      purrr::pmap(.f = dens_wrapper, tbl=tbl)
    

    【讨论】:

    • 不完全。我希望它返回数据框列表。每个数据框 3 列。您的输出给出了 NA。查看我的更新。
    • @pdubois pmap 将返回一个列表(pmap_df 将这些列表组合在一个 df 中,这就是为什么有很多 NA,因为每个结果都有不同的列名)
    • 谢谢。我试过你的编辑。很接近。但是我怎么发现最后一个小标题尺寸是` 150 x 2. Expected all 16 tibble has dimension 150 x 3`
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多