如何使用 cur_column select 列并应用函数?

How to select columns using cur_column and apply function?

我正在尝试使用 rowSums 添加列,因为它是一个快速函数,使用 cur_column 因为 select 列取决于初始列 a_value b_value。这是一个代表,所以它需要使用 rowSums cur_column 或类似的东西,因为它将用于数千行和 ~ 16 列。

输入:

library(tidyverse)

df <- tibble(
  a_value = c(1, 2, 3),
  b_value = c(4, 5, 6),
  a_param1 = c(7, 8, 9),
  b_param1 = c(10, 11, 12),
  a_param2 = c(13, 14, 15),
  b_param2 = c(16, 17, 18),
  a_param3 = c(19, 20, 21),
  b_param3 = c(22, 23, 24),
  a_param4 = c(25, 26, 27),
  b_param4 = c(28, 29, 30)
)

输入结果。

# A tibble: 3 x 10
  a_value b_value a_param1 b_param1 a_param2 b_param2 a_param3 b_param3 a_param4 b_param4
    <dbl>   <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
1       1       4        7       10       13       16       19       22       25       28
2       2       5        8       11       14       17       20       23       26       29
3       3       6        9       12       15       18       21       24       27       30

期望的输出。 a|bvalue_value_exc_parami i+1a|b_paramia|b_parami+1

# A tibble: 3 x 14
  a_value b_value a_param1 b_param1 a_param2 b_param2 a_param3 b_param3 a_param4 b_param4 a_value_exc_param_12 b_value_exc_param_12 a_value_exc_param_34 b_value_exc_param_34
    <dbl>   <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>                <dbl>                <dbl>                <dbl>                <dbl>
1       1       4        7       10       13       16       19       22       25       28                   20                   26                   44                   50
2       2       5        8       11       14       17       20       23       26       29                   22                   28                   46                   52
3       3       6        9       12       15       18       21       24       27       30                   24                   30                   48                   54

到目前为止我试过的方法都行不通:


df %>% 
  mutate(
    across(
      contains("_value"),
      list(
      param_12 = rowSums(~ select(.,
                     get(str_replace(cur_column(), "_value", "_param1")),
                     get(str_replace(cur_column(), "_value", "_param2"))
                     )
           ),
      param_34 = rowSums(~ select(.,
                       get(str_replace(cur_column(), "_value", "_param3")),
                       get(str_replace(cur_column(), "_value", "_param4"))
      )
      
      ),
      .names = "{.col}_exc_{.fn}"
           
  )
  )
  )

可能还有另一种我不知道的简单有效的方法,请随时提供,谢谢。

您可以使用以下内容:

library(dplyr)
library(stringr)

df %>% 
  transmute(across(contains("_value"),
                list(param_12 = ~rowSums(select(cur_data(),
                            str_replace(cur_column(), "_value", "_param1"),
                            str_replace(cur_column(), "_value", "_param2"))), 
                     param_34 = ~rowSums(select(cur_data(),
                            str_replace(cur_column(), "_value", "_param3"),
                            str_replace(cur_column(), "_value", "_param4")))), 
                .names = "{.col}_exc_{.fn}"))

#  a_value_exc_param_12 a_value_exc_param_34 b_value_exc_param_12 b_value_exc_param_34
#                 <dbl>                <dbl>                <dbl>                <dbl>
#1                   20                   44                   26                   50
#2                   22                   46                   28                   52
#3                   24                   48                   30                   54

我在这里使用 transmute 而不是 mutate 来显示输出。在您的真实情况下,您当然可以使用 mutate 来附加这些新列。


我们可以写一个函数来避免代码重复。

apply_sum <- function(data, col, val, replace) {
  rowSums(select(data, str_replace(col, val, replace)))
}

df %>% 
  transmute(across(contains("_value"),
                   list(
               param_12 = ~apply_sum(cur_data(), cur_column(), 'value', c('param1', 'param2')),
               param_34 = ~apply_sum(cur_data(), cur_column(), 'value', c('param3', 'param4'))),
                   .names = "{.col}_exc_{.fn}"))