tidyverse 中的重复变异

标签 r dplyr tidyverse

考虑以下小标题和以下向量:

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/

相关文章:

r - Dplyr 中的条件评估

r - 如何 reshape 宽汇总表?

轻松替换 R 中的多个单词; str_replace_all 给出两个对象长度不相等的错误

performance - data.frame 方法的最有效列表?

r - 带条件的 Dplyr 过滤器

从多个字符串中删除多个匹配列

r - ggplot 使用分组日期变量(例如 year_month)

r - 如何在复杂数据的情况下分离行

r - 我如何知道我在 ggplot 中使用的颜色代码以添加具有相同颜色的垂直线?

r - 恢复图形参数时的警告