【问题标题】:dplyr mutate: pass list of variables to create multiple new variablesdplyr mutate:传递变量列表以创建多个新变量
【发布时间】:2020-07-05 00:55:40
【问题描述】:

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

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

任何指针都会很棒!

【问题讨论】:

标签: r dplyr


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    或者:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-01
      • 2018-07-31
      • 1970-01-01
      • 2018-10-03
      • 2021-07-05
      • 1970-01-01
      • 2018-08-13
      • 2020-04-28
      相关资源
      最近更新 更多