考虑以下小标题和以下向量:
library(tidyverse)
a <- tibble(val1 = 10:15, val2 = 20:25)
params <- 1:3
我还有一个函数myfun
,它接受任意长度的向量和整数作为输入并返回相同长度的向量。出于演示目的,您可以考虑
myfun <- function(x, k) dplyr::lag(x, k)
我想创建以下内容:对于 a
中的每一列和 params
中的每个元素,我想创建一个由 myfun(col , params[i])
。
在上面的玩具示例中,可以这样实现:
a %>% mutate_at(1:2, funs(run1 = myfun), k = params[1]) %>%
mutate_at(1:2, funs(run2 = myfun), k = params[2]) %>%
mutate_at(1:2, funs(run3 = myfun), k = params[3])
是否有更优雅的方法来做到这一点?如果 params 很长,那么这个解决方案就变得不可行。当然,可以使用 for 循环来做到这一点,但我认为 tidyverse 中可能有一个解决方案(也许使用 purrr::map
?)
谢谢!
最佳答案
这是使用 tidyverse 的解决方案:
library(tidyverse)
a <- tibble(val1 = 10:15, val2 = 20:25)
params <- 1:3
#set the column names, add leading zeroes based om max(params)
run_names <- paste0("run", formatC(params, width = nchar(max(params)), flag = "0"))
#what functions to perform
lag_functions <- setNames(paste("dplyr::lag( ., ", params, ")"), run_names)
#perfporm functions
a %>% mutate_at(vars(1:2), funs_(lag_functions ))
# # A tibble: 6 x 8
# val1 val2 val1_run1 val2_run1 val1_run2 val2_run2 val1_run3 val2_run3
# <int> <int> <int> <int> <int> <int> <int> <int>
# 1 10 20 NA NA NA NA NA NA
# 2 11 21 10 20 NA NA NA NA
# 3 12 22 11 21 10 20 NA NA
# 4 13 23 12 22 11 21 10 20
# 5 14 24 13 23 12 22 11 21
# 6 15 25 14 24 13 23 12 22
关于tidyverse 中的重复变异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51337624/