我通常必須對一系列可以通過後綴標識的變量/列執行等效計算(範圍,比方說從 _a 到 _i)並將結果保存在新的變量/列中。計算是等效的,但在計算中使用的變量之間有所不同。這些可以再次通過相同的後綴(_a 到 _i)標識。所以我基本上想要實現的是以下內容:
newvar_a = (oldvar1_a + oldvar2_a) - z
...
newvar_i = (oldvar1_i + oldvar2_i) - z
這是我得到的最遠的:
mutate(across(c(oldvar1_a:oldvar1_i), ~ . - z, .names = "{col}_new"))
因此,我能夠“循環”oldvar1_a 到oldvar1_i,從它們中減去z 並將結果保存在名為oldvar1_a_new 的新列中到oldvar1_i_new。但是,我無法在計算中包含 oldvar2_a 到 oldvar2_i,因為 R 不會遍歷它們。(此外,我仍然需要重命名新列)。
我找到了一種使用 for 循環實現結果的方法。但是,這絕對不是最有效和最直接的方法:
for (i in letters[1:9]) {
oldvar1_x <- paste0("oldvar1_", i)
oldvar2_x <- paste0("oldvar2_", i)
newvar_x <- paste0("newvar_", i)
df <- df %>%
mutate(!!sym(newvar_x) := (!!sym(oldvar1_x) + !!sym(oldvar2_x)) - z)
}
因此,我想知道是否/如何在可以通過後綴標識的多列上進行 mutate(across) 循環(如上例所示)
在這種情況下,您可以使用cur_data()
和cur_column()
來利用我們想要將具有相同後綴但只需要交換數字的列相加。
library(dplyr)
df <- data.frame(
oldvar1_a = 1:3,
oldvar2_a = 4:6,
oldvar1_i = 7:9,
oldvar2_i = 10:12,
z = c(1,10,20)
)
mutate(
df,
across(
starts_with("oldvar1"),
~ (.x + cur_data()[gsub("1", "2", cur_column())]) - z,
.names = "{col}_new"
)
)
#> oldvar1_a oldvar2_a oldvar1_i oldvar2_i z oldvar2_a oldvar2_i
#> 1 1 4 7 10 1 4 16
#> 2 2 5 8 11 10 -3 9
#> 3 3 6 9 12 20 -11 1
如果你想使用 with case_when
,只需確保索引 using [[
,你可以在這裡閱讀更多。
df <- data.frame(
oldvar1_a = 1:3,
oldvar2_a = 4:6,
oldvar1_i = 7:9,
oldvar2_i = 10:12,
z = c(1,2,0)
)
mutate(
df,
across(
starts_with("oldvar1"),
~ case_when(
z == 1 ~ .x,
z == 2 ~ cur_data()[[gsub("1", "2", cur_column())]],
TRUE ~ NA_integer_
),
.names = "{col}_new"
)
)
#> oldvar1_a oldvar2_a oldvar1_i oldvar2_i z oldvar1_a_new oldvar1_i_new
#> 1 1 4 7 10 1 1 7
#> 2 2 5 8 11 2 5 11
#> 3 3 6 9 12 0 NA NA
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句