首页 > 解决方案 > 将 dplyr 函数映射到 R 数据帧中的每个变量对组合

问题描述

我想将一个函数映射到 R 中数据框中的每个变量组合对,并返回一个数据框,其中包含每对的函数输出。我可以像这样手动执行此操作:

library(tidyverse)

df <- tibble(a = c(1, 2), b = c(4, 3), c = c(5, 7))

f <- function(a, b) a - b # a simple function for sake of example

df %>% transmute(a_minus_b = f(a, b),
                 a_minus_c = f(a, c),
                 b_minus_c = f(b, c),
                 b_minus_a = f(b, a),
                 c_minus_a = f(c, a),
                 c_minus_b = f(c, b))

对于具有许多变量的数据框,手动执行此操作显然是不切实际的。如何使用迭代将我的函数应用于每个组合变量对?

标签: rdplyrpurrr

解决方案


另一种使用dplyrand的方法purrr可能如下所示:

library(tidyverse)

df <- tibble(a = c(1, 2), b = c(4, 3), c = c(5, 7))

f <- function(a, b) a - b # a simple function for sake of example

f_help <- function(x) {
  df %>% 
    transmute_at(setdiff(names(.), x), ~ f(!!sym(x), .x)) %>%
    rename_all(.funs = ~ paste0(x, "_minus_", .x))
}

map(names(df), f_help) %>% 
  bind_cols()
#> # A tibble: 2 x 6
#>   a_minus_b a_minus_c b_minus_a b_minus_c c_minus_a c_minus_b
#>       <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>
#> 1        -3        -4         3        -1         4         1
#> 2        -1        -5         1        -4         5         4

推荐阅读