Reputation: 7800
I have the following code:
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
I'm trying to use dens_wrapper()
function on the set of parameter
constructed by this:
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
With this code:
allcomb_var %>%
purrr:pmap(list(tbl=tbl, var1=Var1, var2=Var2), dens_wrapper)
But it gives me this error:
Error in as_function(.f, ...) : object 'Var1' not found
What's the right way to do it?
@baptise solution gives this (not quite what I expect):
# 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
Upvotes: 0
Views: 125
Reputation: 77114
something along those lines?
allcomb_var <- expand.grid(var1 = tbl_colnames, var2 = tbl_colnames,
stringsAsFactors = FALSE)
allcomb_var %>%
purrr::pmap(.f = dens_wrapper, tbl=tbl)
Upvotes: 2