dplyr将具有更改参数的单个函数应用于同一列

问题描述

我有一个只有一列的简单df,并且我想使用一个函数(在此情况下为sum_x)中仅更改一个参数就创建多个新列。有没有一种方法比我在下面的dplyr显示方法更有效?理想情况下,我可以合并sum_vec并在一行中创建100个新列。这似乎是一个非常简单的问题,但是我不知道如何使用dplyr来有效地解决这个问题。

df <- data.frame(x = 1:20)
sum_x <- function(x,y){
 x + y
}

sum_vec <- 1:100
df %>% mutate(x_1 = sum_x(x,1)) %>% mutate(x_2 = sum_x(x,2)) %>% mutate(x_3 = sum_x(x,3))

解决方法

尝试一下

library(tidyverse)
bind_cols(df,map_dfc(1:3,~ df %>% transmute(!!paste0("x_",.x) := x + .x)))

    x x_1 x_2 x_3
1   1   2   3   4
2   2   3   4   5
3   3   4   5   6
4   4   5   6   7
5   5   6   7   8
6   6   7   8   9
7   7   8   9  10
8   8   9  10  11
9   9  10  11  12
10 10  11  12  13
11 11  12  13  14
12 12  13  14  15
13 13  14  15  16
14 14  15  16  17
15 15  16  17  18
16 16  17  18  19
17 17  18  19  20
18 18  19  20  21
19 19  20  21  22
20 20  21  22  23
,

如果您不喜欢for循环,那么我与您同在。因此,我不确定这是否良好/有效。有兴趣寻求更好的解决方案。

library(dplyr)

for (i in 1:100) {
  x_header = paste("x",i,sep = "_")
  df = df %>% 
    mutate(!!x_header := sum_x(x,i))
}
> df[1:11,1:11]
    x x_1 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10
1   1   2   3   4   5   6   7   8   9  10   11
2   2   3   4   5   6   7   8   9  10  11   12
3   3   4   5   6   7   8   9  10  11  12   13
4   4   5   6   7   8   9  10  11  12  13   14
5   5   6   7   8   9  10  11  12  13  14   15
6   6   7   8   9  10  11  12  13  14  15   16
7   7   8   9  10  11  12  13  14  15  16   17
8   8   9  10  11  12  13  14  15  16  17   18
9   9  10  11  12  13  14  15  16  17  18   19
10 10  11  12  13  14  15  16  17  18  19   20
11 11  12  13  14  15  16  17  18  19  20   21