[英]dplyr mutate: pass list of variables to create multiple new variables
我正在嘗試做一些直覺上感覺很簡單但我無法弄清楚的事情。 我希望計算多列的增量:我有A1, B1, C1
和A2, B2, C2
列A_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 ),而不是嘗試創建多個新列時...
任何指針都會很棒!
一種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
或者:
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.