使用 mutate 将两个以相同数字结尾的变量多次相加

问题描述 投票:0回答:1

我有一个包含变量

V1
V2
e1
e2
的数据框,我想加起来
V1
e1
,以及
V2
e2
。它应该适用于数字 1 到
n
,其中
n
是嵌入此代码的函数的参数。

下面的代码是我现在有的,可以运行。但它会创建所有可能的总和,例如我不想要的 V1 +e2。

n <- seq_along(1:2)

df <- data.frame(V1=runif(5), V2=runif(5, min = 3,max = 5), e1=100, e2=10)

df %>%
  mutate(across(.cols =  n, .fns = ~ across(starts_with("V")) + across(starts_with("e")) , .names ="{'U'}_{n}")) 

另一种可行的方法是这个

map_dfc(.x = seq_along(cols),
        .f = function(ix){
          df %>%
            mutate(!!paste0("U_", ix, ".V", ix) := .data[[paste0("V", ix)]] + .data[[paste0("e", ix)]]) %>%
            select(paste0("U_", ix, ".V", ix))
    }) %>%
  bind_cols(df, .)

但我不喜欢它,因为我想避免

paste0
并且我不想迭代
mutate
,而是在
mutate
.

非常感谢您的帮助。

r dplyr purrr mutate
1个回答
1
投票

您的代码创建了所有组合的总和,因为您使用了嵌套的

across
。把里面的
across
搬出来总结一下:

df %>%
  mutate(across(starts_with("V"), .names = "{.col}_e") + across(starts_with("e")))

#   V1 V2  e1 e2 V1_e V2_e
# 1  3  3 100 10  103   13
# 2  2  1 100 10  102   11
# 3  5  2 100 10  105   12
# 4  4  5 100 10  104   15
# 5  1  4 100 10  101   14
数据
set.seed(123)
df <- data.frame(V1 = sample(5), V2 = sample(5), e1 = 100, e2 = 10)
© www.soinside.com 2019 - 2024. All rights reserved.