【问题标题】:How to use dplyr operations with a list of strings for column names如何将 dplyr 操作与列名的字符串列表一起使用
【发布时间】:2020-11-01 13:19:41
【问题描述】:

是否有一种可靠的方法来使用包含与数据框列名称相对应的字符串列表的变量来传递给各种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 操作,而不是一遍又一遍地重新键入每个列名

【问题讨论】:

    标签: r string dplyr multiple-columns


    【解决方案1】:

    我们可以使用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
    

    【讨论】:

      【解决方案2】:

      我们可以使用dplyr中的across,而无需使用任何其他包

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

      【讨论】:

        【解决方案3】:

        请参阅 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}}” (函数定义)。我错过了什么吗?
        • 看起来整洁的诗句正在从syms!!! 移到emabrace。我建议回去阅读“使用 dplyr 编程”小插图。
        猜你喜欢
        • 2017-09-10
        • 2021-02-16
        • 2023-03-10
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 2017-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多