2017-07-08 27 views
1

我有以下代碼:如何使用purrr基於在數據幀由參數應用功能


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 

回答

3

的東西嗎?

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

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

不完全。我期望它返回數據幀列表。每個數據幀3列。您的輸出提供了NAs。查看我的更新。 – pdubois

+1

@pdubois pmap將返回一個列表(pmap_df將這些列表結合到一個df中,這就是爲什麼有大量的NAs,因爲每個結果都有不同的列名) – baptiste

+0

謝謝。我試過你的編輯。很接近。但是,我怎麼發現最後的骰子尺寸是'150 x 2'。預計所有16個Tibble的尺寸爲'150 x 3' – pdubois