r - использовать dplyr::group_by в сочетании с purrr::pmap

У меня есть следующий фрейм данных:

df <- data.frame(a = c(1:20),
             b = c(2:21),
             c = as.factor(c(rep(1,5), rep(2,10), rep(3,5))))

и я хочу сделать следующее:

df1 <- df %>% group_by(c) %>% mutate(a = lead(b))

но изначально у меня есть много переменных, к которым мне нужно применить lead() функция в сочетании с group_by() на нескольких переменных. Я пытаюсь purrr::pmap() для достижения этой цели:

df2 <- pmap(list(df[,1],df[,2],df[,3]), function(x,y,z) group_by(z) %>% lead(y))

К сожалению, это приводит к ошибке:

 Error in UseMethod("group_by_") : 
  no applicable method for 'group_by_' applied to an object of class "c('integer', 'numeric')"

1 ответ

Решение

Вы можете сделать это с mutate_at и назвал аргументы funs(), который создает новые столбцы вместо их перезаписи. Обратите внимание, что это ничего не значит a но вы можете переименовать столбцы после этого по желанию.

df <- data.frame(
  a = c(1:20),
  b = c(2:21),
  b2 = 3:22,
  b3 = 4:23,
  c = as.factor(c(rep(1, 5), rep(2, 10), rep(3, 5)))
)

library(tidyverse)
df %>%
  group_by(c) %>%
  mutate_at(vars(starts_with("b")), funs(lead = lead(.)))
#> # A tibble: 20 x 8
#> # Groups:   c [3]
#>        a     b    b2    b3 c     b_lead b2_lead b3_lead
#>    <int> <int> <int> <int> <fct>  <int>   <int>   <int>
#>  1     1     2     3     4 1          3       4       5
#>  2     2     3     4     5 1          4       5       6
#>  3     3     4     5     6 1          5       6       7
#>  4     4     5     6     7 1          6       7       8
#>  5     5     6     7     8 1         NA      NA      NA
#>  6     6     7     8     9 2          8       9      10
#>  7     7     8     9    10 2          9      10      11
#>  8     8     9    10    11 2         10      11      12
#>  9     9    10    11    12 2         11      12      13
#> 10    10    11    12    13 2         12      13      14
#> 11    11    12    13    14 2         13      14      15
#> 12    12    13    14    15 2         14      15      16
#> 13    13    14    15    16 2         15      16      17
#> 14    14    15    16    17 2         16      17      18
#> 15    15    16    17    18 2         NA      NA      NA
#> 16    16    17    18    19 3         18      19      20
#> 17    17    18    19    20 3         19      20      21
#> 18    18    19    20    21 3         20      21      22
#> 19    19    20    21    22 3         21      22      23
#> 20    20    21    22    23 3         NA      NA      NA

Создано 2018-09-07 пакетом представлением (v0.2.0).

Другие вопросы по тегам