dplyr mutate: передать список переменных для создания нескольких новых переменных - PullRequest
2 голосов
/ 24 марта 2020

Я пытаюсь сделать что-то, что интуитивно кажется простым, но я не могу понять это. Я надеюсь вычислить дельту для ряда столбцов: у меня есть столбцы A1, B1, C1 и A2, B2, C2, и я хотел бы создать столбцы A_delta, B_delta, C_delta, вычитая A2 - A1 et c.

Вот что Я думал, что смогу сделать с dplyr (используя mtcars в качестве примера):

# Create test data with changed columns
d.test <- mtcars %>% 
            rownames_to_column() %>% 
            mutate(mpg2 = mpg - 4, 
                   cyl2 = cyl - 1)

# Calculate deltas & add as new columns
d.test %>% mutate(!!c("mpg_delta", "cyl_delta") := c(mpg2, cyl2) - c(mpg, cyl))

Ясно, что это не сработает, но я не могу понять правильный синтаксис. Я читал об использовании purrr, но это кажется применимым при попытке выполнить различные действия для строки (как здесь dplyr mutate с использованием переменных столбцов ), а не при попытке создать несколько новых столбцов ...

Любые указатели были бы великолепны!

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Или:

my_diff <- function(d, newvars, vars1, vars2) {
  cmd <- unlist(pmap(list(newvars, vars1, vars2), ~exprs(!!..1 := !!..2 - !!..3)))
  d %>%
    mutate(!!!cmd)
}
d.test %>%
  my_diff(vars(delta_mpg, delta_cyl), vars(mpg2, cyl2), vars(mpg, cyl))
1 голос
/ 24 марта 2020

Одна dplyr и purrr возможность может быть:

map2_dfr(.x = d.test %>%
          select(mpg2, cyl2),
         .y = d.test %>%
          select(mpg, cyl), 
         ~ .x - .y) %>%
 setNames(c("mpg_delta", "cyl_delta"))

   mpg_delta cyl_delta
       <dbl>     <dbl>
 1        -4        -1
 2        -4        -1
 3        -4        -1
 4        -4        -1
 5        -4        -1
 6        -4        -1
 7        -4        -1
 8        -4        -1
 9        -4        -1
10        -4        -1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...