【发布时间】:2021-05-08 03:11:09
【问题描述】:
让我们假设以下数据:
df <- data.frame(x = c(1, 2),
y = c(3, 4),
z = c(5, 6))
让我们进一步假设我有一个包含我想要处理的列名的向量,例如
var_names_1 <- c("test", "x", "y")
var_names_2 <- c("test", "z")
现在我要做的是使用across 改变var_names_... 对象中除第一个元素之外的所有df 列。 (在这种情况下,我会循环遍历我的两个 var_names 对象)。
所以在第一个循环中我想改变列 x 和 y,在第二个循环中我想改变 z。
for (i in 1:2)
{
df %>%
mutate(across(!!sym(paste0("var_names_", i, [-1])), as_factor))
}
但是,我收到以下错误消息:
Error: Problem with `mutate()` input `..1`.
x Can't subset columns that don't exist.
x Column `var_names_1` doesn't exist.
i Input `..1` is `across(`var_names_1`, as_factor)`.
我以为我终于了解了一些 tidyeval 事物的用例,但显然我的 !!sym 方法在这里不起作用。有什么建议吗?
【问题讨论】:
-
是否有理由需要循环?为什么不直接使用他们的位置,或者其他整洁的选择选项?
-
你会先选择然后变异。
-
这当然是一个简化的例子,在可能的现实生活场景中,我需要将相同的突变应用于我需要动态定义的两个稍微不同的列列表。所以在一种情况下,我想改变例如X1、X2、q、v、z。在第二种情况下,我想对“s1、s2、h、t6”或某事物进行变异。像那样。因此,我无法将任何模式与 tidy select helpers 一起使用。
-
@JuanCamiloRiveraPalacio 好的,这可能是一种解决方法,但是我需要再次加入原始的完整数据框。这里的重点是我还有数百个我想要/需要保留的其他列。
标签: r tidyverse dplyr tidyeval across