如何使用dplyr操作处理字符串列表列名?

4

有没有一种健壮的方法,可以使用包含数据框列名字符串列表的变量,并传递给各种 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)

然而,有时我已经有一个列名列表,我想将其传递到 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)

在上面的简单示例中,每次进行`dplyr`操作重新输入“a,c”不是什么大问题。但是,如果我的列列表更长,我宁愿通过传递变量到`dplyr`操作中,而不是一遍又一遍地重新输入列名列表。
有没有什么技巧可以实现这个目标?
我将接受一种解决方案,该解决方案显示如何从列名称列表创建一个变量,该变量可以在各种`dplyr`操作中使用,以替代每次重新输入每个列名称。
3个回答

6
我们可以使用syms!!!将列名作为变量传递。
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

1
如果有人遇到“找不到函数'syms'”的错误,请使用“rlang :: syms”(我很长时间都没有意识到实际上是使用了“rlang”而不是“dplyr”的函数:') - spops

5

我们可以使用dplyr中的across而不必使用其他任何软件包。

library(dplyr)
df %>% 
     count(across(all_of(relevantCols))) %>% 
     filter(n > 1)
#   a c n
#1 1 1 2
#2 2 2 2

1

请查看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)
)

dupcol <- function(df, one, two){
   df %>%
      select({{one}}, {{two}}) %>%
      count({{one}}, {{two}}) %>%
      filter(n > 1)
}

dupcol(df, a, c)

我认为Ronak的答案更优秀。它不需要定义一个新函数。此外,我不明白你提供的函数是如何规避我的问题的 - 你的解决方案是在多个地方重新输入' a,c ',而不是在多个地方重新输入 '{{one}},{{two}}'(函数定义)。我有什么遗漏吗? - Jayden.Cameron
看起来整洁的verse正在远离syms!!!,并转向embrace。我建议回去阅读“使用dplyr进行编程”的vignette。 - Dave2e

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接