我想编写此代码的较短版本:
ResultsTable <- ResultsTable %>%
mutate(V_a = as.integer(V_a + h2_a),
V_b = as.integer(V_b + h2_b),
V_c = as.integer(V_c + h2_c),
V_d = as.integer(V_d + h2_d),
V_e = as.integer(V_e + h2_e),
V_f = as.integer(V_f + h2_f))
有几个变量前缀和后缀需要组合。
此外,这只应针对
ResultsTable$cond == 1
的行执行此操作,但必须保留所有行。
我尝试使用 across(),但这似乎不适用于前缀和后缀。
我什至不知道如何解决这个问题。帮忙!
如果您提供可重现的示例以及预期的输出,那么帮助会更容易。这是一个简单的例子 -
df <- data.frame(cond = c(1, 1, 0, 1, 0),
V_a = 1:5, V_b = 11:15,
h2_a = 26:30, h2_b = 36:40)
df
# cond V_a V_b h2_a h2_b
#1 1 1 11 26 36
#2 1 2 12 27 37
#3 0 3 13 28 38
#4 1 4 14 29 39
#5 0 5 15 30 40
自动化此操作的一种方法是使用
across
和 pick
。为了更好地了解结果,我使用 res_V_a
中的 res_V_b
参数创建新列来存储输出(.names
和 across
)。对于这些结果列,我们检查 cond
列是 1 还是 0,并使用 ifelse
应用条件。
library(dplyr)
df %>%
mutate(across(starts_with("V"), .names = "res_{col}") + pick(starts_with("h2")),
across(starts_with("res"), ~ifelse(cond == 1, .,
get(sub("res_", "", cur_column())))))
# cond V_a V_b h2_a h2_b res_V_a res_V_b
#1 1 1 11 26 36 27 47
#2 1 2 12 27 37 29 49
#3 0 3 13 28 38 3 13
#4 1 4 14 29 39 33 53
#5 0 5 15 30 40 5 15