0

我正在尝试添加列,rowSums因为它是一个快速函数,使用 cur_column 因为选择列取决于初始列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

所需的输出。value_value_exc_param是a|b_param和_param之和i i+1a|bia|bi+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}"
           
  )
  )
  )

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

4

1 回答 1

2

您可以使用以下内容:

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}"))
于 2021-04-04T04:00:14.120 回答