如何使用 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|b
value_value_exc_parami
i+1
是 a|b
_parami
和 a|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}"))
我正在尝试使用 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|b
value_value_exc_parami
i+1
是 a|b
_parami
和 a|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}"))