繁体   English   中英

如何使用Purrr根据数据框中的参数应用功能

[英]How to use purrr to apply function based on parameters made in a dataframe

我有以下代码:


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

遵循这些原则?

allcomb_var <- expand.grid(var1 = tbl_colnames, var2 = tbl_colnames,
                           stringsAsFactors = FALSE)

allcomb_var %>% 
  purrr::pmap(.f = dens_wrapper, tbl=tbl)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM