использование purr для отображения строк из фреймов данных - PullRequest
0 голосов
/ 25 октября 2018

Рассмотрим этот простой пример

testdf <- data_frame(col1 = c(2, 2),
                     col2 = c(1, 2))

# A tibble: 2 x 2
   col1  col2
  <dbl> <dbl>
1     2     1
2     2     2

Затем у меня есть еще один тиббл, содержащий аргументы, которые я хочу передать map2

mapdf <- data_frame(myinput = c('col1', 'col2'),
                    myoutput = c('col2', 'col1'))

# A tibble: 2 x 2
  myinput myoutput
  <chr>   <chr>   
1 col1    col2    
2 col2    col1 

А вот простая функция

myfunc <- function(input, output){
  output <- sym(output)
  input <- sym(input)
    testdf %>% mutate(!!input := !!output + 1)
}

Например, на первой итерации это просто равно:

> testdf %>% mutate(col1 = col2 + 1)
# A tibble: 2 x 2
   col1  col2
  <dbl> <dbl>
1     2     1
2     3     2

Однако моя попытка purrr ниже возвращает пустой фрейм данных.В чем здесь проблема?

> mapdf %>% map2_dfr(.$myinput, .$myoutput, myfunc(.x, .y))
# A tibble: 0 x 0

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Труба передает testdf в качестве первого аргумента, что я не думаю, что вы хотите.Кроме того, я считаю, что вам понадобится ~ для сигнализации анонимной функции, если вы используете .x и .y.

> mapdf %>% {map2_dfr(.$myinput, .$myoutput, ~myfunc(.x, .y))}
# A tibble: 4 x 2
   col1  col2
  <dbl> <dbl>
1     2     1
2     3     2
3     2     3
4     2     3

Тем не менее, я не думаю, что вам нужна анонимная функция:

> mapdf %>% {map2_dfr(.$myinput, .$myoutput, myfunc)}
# A tibble: 4 x 2
   col1  col2
  <dbl> <dbl>
1     2     1
2     3     2
3     2     3
4     2     3
0 голосов
/ 25 октября 2018

Вы можете использовать pmap

pmap(mapdf, ~ myfunc(.x, .y))

[[1]]
# A tibble: 2 x 2
   col1  col2
  <dbl> <dbl>
1     2     1
2     3     2

[[2]]
# A tibble: 2 x 2
   col1  col2
  <dbl> <dbl>
1     2     3
2     2     3

Редактировать 1: как предложено в комментарии

pmap_dfr(mapdf, ~ myfunc(.x, .y), .id = 'id')

# A tibble: 4 x 3
  id     col1  col2
  <chr> <dbl> <dbl>
1 1         2     1
2 1         3     2
3 2         2     3
4 2         2     3

Редактировать 2:

Можно также сослаться на столбец #используя ..1, ..2, ..3 и т. д.

pmap_dfr(mapdf, ~ myfunc(input = ..1, output = ..2), .id = 'id')
#> # A tibble: 4 x 3
#>   id     col1  col2
#>   <chr> <dbl> <dbl>
#> 1 1         2     1
#> 2 1         3     2
#> 3 2         2     3
#> 4 2         2     3

Вместо того, чтобы ссылаться на имена столбцов, мы можем использовать трюк из этого ответа

pmap_dfr(mapdf, ~ with(list(...), myfunc(myinput, myoutput)), .id = 'id')
#> # A tibble: 4 x 3
#>   id     col1  col2
#>   <chr> <dbl> <dbl>
#> 1 1         2     1
#> 2 1         3     2
#> 3 2         2     3
#> 4 2         2     3
...