mutate(across) 在 tidyverse 中生成多個新列

用戶17487234

我通常必須對一系列可以通過後綴標識的變量/列執行等效計算(範圍,比方說從 _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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章