Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dplyr对同一列应用一个具有可变参数的函数_R_Dplyr_Mutate - Fatal编程技术网

dplyr对同一列应用一个具有可变参数的函数

dplyr对同一列应用一个具有可变参数的函数,r,dplyr,mutate,R,Dplyr,Mutate,我有一个简单的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 %>% mut

我有一个简单的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))

df%突变(x_3=sum_x(x,3))

如果你不喜欢
循环,我支持你。所以我不确定这是否好/有效。对更好的解决方案感兴趣

library(dplyr)

for (i in 1:100) {
  x_header = paste("x", i, sep = "_")
  df = df %>% 
    mutate(!!x_header := sum_x(x, i))
}
这样试试看

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