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')"

person adl    schedule 07.09.2018    source источник
comment
можете уточнить, что меняется? вам нужно изменить группирующую переменную одновременно с переменной lead()? Как они соотносятся друг с другом, и существует ли закономерность в отношении того, как они называются, или их нужно указывать пользователем? Я думаю, что ваш пример нужно расширить еще несколькими столбцами   -  person Calum You    schedule 07.09.2018
comment
@Calum вам группирующую переменную c изменять не нужно. Я хочу, чтобы переменная a была изменена с помощью функции lead(), применяемой к группам, определенным переменной c. Прямо как в этом экс. df1 <- df %>% group_by(c) %>% mutate(a = lead(b))   -  person adl    schedule 07.09.2018
comment
но есть много b и много соответствующих a? важно перезаписать?   -  person Calum You    schedule 07.09.2018
comment
это не обязательно. Я думал, что это можно сделать просто с tidyr::nest(), может быть?   -  person adl    schedule 07.09.2018


Ответы (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

Создано 7 сентября 2018 г. пакетом REPEX (v0.2.0).

person Calum You    schedule 07.09.2018