我们可以用map
library(dplyr)
library(purrr)
library(stringr)
map_dfc(1:3, ~ df %>%
transmute(!! str_c('x', .x) := x + .x)) %>%
bind_cols(df, .)
# x x1 x2 x3
#1 1 2 3 4
#2 2 3 4 5
#3 3 4 5 6
对于数据库,执行以下操作collect
添加列之前
dat <- tbl(con, "mtcars") %>%
select(carb) %>%
distinct(carb) %>%
arrange(carb) %>%
collect()
map_dfc(dat$carb, ~ dat %>%
transmute(!! str_c('carb', .x) := carb + .x)) %>%
bind_cols(dat, .)
# A tibble: 6 x 7
# carb carb1 carb2 carb3 carb4 carb6 carb8
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1 2 3 4 5 7 9
#2 2 3 4 5 6 8 10
#3 3 4 5 6 7 9 11
#4 4 5 6 7 8 10 12
#5 6 7 8 9 10 12 14
#6 8 9 10 11 12 14 16
或者如果我们想之前这样做的话还有另一个选择collect
ing 是传递一个表达式mutate
tbl(con, "mtcars") %>%
select(carb) %>%
distinct(carb) %>%
arrange(carb) %>%
mutate(!!! rlang::parse_exprs(str_c('carb', 1:3, sep="+", collapse=";"))) %>%
rename_at(-1, ~ str_c('carb', 1:3)) %>%
show_query() %>%
collect()
#<SQL>
#SELECT `carb`, `carb` + 1.0 AS `carb1`, `carb` + 2.0 AS `carb2`, `carb` + 3.0 AS #`carb3`
#FROM (SELECT *
#FROM (SELECT DISTINCT *
#FROM (SELECT `carb`
#FROM `mtcars`))
#ORDER BY `carb`)
# A tibble: 6 x 4
# carb carb1 carb2 carb3
# <dbl> <dbl> <dbl> <dbl>
#1 1 2 3 4
#2 2 3 4 5
#3 3 4 5 6
#4 4 5 6 7
#5 6 7 8 9
#6 8 9 10 11