我有一个包含变量
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
.
非常感谢您的帮助。
您的代码创建了所有组合的总和,因为您使用了嵌套的
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)