簡體   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