繁体   English   中英

dplyr mutate:传递变量列表以创建多个新变量

[英]dplyr mutate: pass list of variables to create multiple new variables

我正在尝试做一些直觉上感觉很简单但我无法弄清楚的事情。 我希望计算多列的增量:我有A1, B1, C1A2, B2, C2A_delta, B_delta, C_delta通过减去A2 - A1等来创建A_delta, B_delta, C_delta列。

这是我认为我可以用dplyr做的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 using variable columns ),而不是尝试创建多个新列时...

任何指针都会很棒!

一种dplyrpurrr可能性可能是:

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

或者:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM