如何将 dplyr 操作与列名字符串列表一起使用

Jay*_*ron 4 string r multiple-columns dplyr

是否有一种可靠的方法来使用包含与数据帧列名称相对应的字符串列表的变量来传递给各种dplyr操作?

我刚刚进入dplyr

当我尝试对数据框中的列子集使用操作时,dplyr当我在逗号分隔的列表中明确命名列时,效果会很好。

这段代码按预期工作

library(dplyr)

# Create dataframe
df <- data.frame(
    a = c(1, 1, 1, 2, 2, 2)
    , b = c(1, 2, 3, 1, 2, 3)
    , c = c(1, 2, 1, 2, 1, 2)
    )

# Identify rows where a * c is duplicated
df %>%
    select(a, c) %>%
    count(a, c) %>%
    filter(n > 1)
Run Code Online (Sandbox Code Playgroud)

但是,有时我已经有了一个列名称列表,我想将其传递到步骤中,dplyr而不是显式命名每个列。但是,我还没有找到一种简单/方便的方法来执行此操作,该方法足够强大,可以处理多种dplyr操作:

该代码不起作用

# Attempting to do the same with a named list of relevant columns
relevantCols <- c("a", "c")

# Fails
df %>%
    select(relevantCols)

# Trying to make new variable based on my relevantCols variable
colsForDplyr <- sapply(relevantCols, eval)

df %>%
    # First step succeeds
    select(colsForDplyr) %>%
    # Fails at count step
    count(colsForDplyr)
Run Code Online (Sandbox Code Playgroud)

在上面的简单示例中,在每次操作中重新键入“a, c”并没有什么大不了的dplyr。但是,如果我有一个较长的列列表,我宁愿将变量传递到操作中,dplyr而不是一遍又一遍地重新键入列名称列表。

关于如何实现这一目标有什么建议吗?

我将接受一个解决方案,该解决方案展示了如何从列名列表创建一个变量,该变量可用于各种dplyr操作,而不是一遍又一遍地重新输入每个列名

Ron*_*hah 6

我们可以使用symswith!!!将列名称作为变量传递。

library(dplyr)
library(rlang)

relevantCols <- c("a", "c")

df %>%
  count(!!!syms(relevantCols)) %>%
  filter(n > 1)

#  a c n
#1 1 1 2
#2 2 2 2
Run Code Online (Sandbox Code Playgroud)


akr*_*run 5

我们可以使用acrossfromdplyr而无需使用任何其他包

library(dplyr)
df %>% 
     count(across(all_of(relevantCols))) %>% 
     filter(n > 1)
#   a c n
#1 1 1 2
#2 2 2 2
Run Code Online (Sandbox Code Playgroud)