'mutate', чтобы добавить два столбца с одним вызовом fn в tidyverse в R - PullRequest
0 голосов
/ 26 февраля 2019

Это вопрос версии 3.4.4 R

Функция голосования voteOnBase, принимает 2 аргумента и возвращает список из 2 элементов: WINNER и VOTE.COUNT.Я хочу использовать его, чтобы добавить эти два столбца к notVotedYet, тиббл.Следующий код работает правильно.

 library(tidyverse)

 withVotes <- notVotedYet %>%
    group_by(BASE) %>%
    mutate(WINNER     = voteOnBase(BASE, CODES)[[1]],
           VOTE.COUNT = voteOnBase(BASE, CODES)[[2]])

Однако он вызывает voteOnBase дважды на одних и тех же входах.Как я могу исключить дополнительный вызов функции, но при этом добавить те же два столбца?

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Возможно, вы захотите использовать group_map:

library(dplyr)
useless_dupes <- function(x){list(x1=x, x2=x)}

mtcars %>%
  group_by(cyl) %>%
  group_map(~as_tibble(useless_dupes(.$disp)))
#> # A tibble: 32 x 3
#> # Groups:   cyl [3]
#>      cyl    x1    x2
#>    <dbl> <dbl> <dbl>
#>  1     4 108   108  
#>  2     4 147.  147. 
#>  3     4 141.  141. 
#>  4     4  78.7  78.7
#>  5     4  75.7  75.7
#>  6     4  71.1  71.1
#>  7     4 120.  120. 
#>  8     4  79    79  
#>  9     4 120.  120. 
#> 10     4  95.1  95.1
#> # ... with 22 more rows
0 голосов
/ 26 февраля 2019

Непросто ответить без примеров данных и вывода, но я бы посоветовал написать voteOnBase() для возврата тиббла, а не списка.Затем вы можете сохранить результат в столбце списка и создать столбцы, используя unnest().

. Для иллюстрации: вот такая функция, square_it(), которая, как и ваша, принимает 2 аргумента и возвращает 2 элемента - но в виде столбцовв таблице.

square_it <- function(x, y) {
  tibble(x = x^2, y = y^2)
}

Мы можем использовать набор данных iris для передачи аргументов.Мы используем pmap() для указания переменных и функции.Столбец списка имеет имя sq:

iris %>% 
  as_tibble() %>% 
  mutate(sq = pmap(list(Sepal.Length, Sepal.Width), square_it))

# A tibble: 150 x 6
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species sq              
          <dbl>       <dbl>        <dbl>       <dbl> <fct>   <list>          
 1          5.1         3.5          1.4         0.2 setosa  <tibble [1 x 2]>
 2          4.9         3            1.4         0.2 setosa  <tibble [1 x 2]>
 3          4.7         3.2          1.3         0.2 setosa  <tibble [1 x 2]>
 4          4.6         3.1          1.5         0.2 setosa  <tibble [1 x 2]>
 5          5           3.6          1.4         0.2 setosa  <tibble [1 x 2]>
 6          5.4         3.9          1.7         0.4 setosa  <tibble [1 x 2]>
 7          4.6         3.4          1.4         0.3 setosa  <tibble [1 x 2]>
 8          5           3.4          1.5         0.2 setosa  <tibble [1 x 2]>
 9          4.4         2.9          1.4         0.2 setosa  <tibble [1 x 2]>
10          4.9         3.1          1.5         0.1 setosa  <tibble [1 x 2]>
# ... with 140 more rows

Просто добавьте %>% unnest(sq) к этому коду, чтобы сгенерировать столбцы x и y:

iris %>% 
  as_tibble() %>% 
  mutate(sq = pmap(list(Sepal.Length, Sepal.Width), square_it)) %>%
  unnest(sq)

# A tibble: 150 x 7
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species     x     y
          <dbl>       <dbl>        <dbl>       <dbl> <fct>   <dbl> <dbl>
 1          5.1         3.5          1.4         0.2 setosa   26.0 12.2 
 2          4.9         3            1.4         0.2 setosa   24.0  9   
 3          4.7         3.2          1.3         0.2 setosa   22.1 10.2 
 4          4.6         3.1          1.5         0.2 setosa   21.2  9.61
 5          5           3.6          1.4         0.2 setosa   25   13.0 
 6          5.4         3.9          1.7         0.4 setosa   29.2 15.2 
 7          4.6         3.4          1.4         0.3 setosa   21.2 11.6 
 8          5           3.4          1.5         0.2 setosa   25   11.6 
 9          4.4         2.9          1.4         0.2 setosa   19.4  8.41
10          4.9         3.1          1.5         0.1 setosa   24.0  9.61
# ... with 140 more rows
...