如何将 dplyr 操作与列名的字符串列表一起使用
How to use dplyr operations with a list of strings for column names
是否有可靠的方法来使用包含与数据框列名称对应的字符串列表的变量,以传递给各种 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
步骤,而不是明确命名每个列。但是,我还没有找到足够强大的 easy/convenient 方法来处理多个 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
操作的列名列表创建变量,而不是一遍又一遍地重新输入每个列名
我们可以使用 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
查看dplyr编程指南并创建一个函数并使用embrace函数,{{ }}
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)
我们可以使用 dplyr
中的 across
,而无需使用任何其他包
library(dplyr)
df %>%
count(across(all_of(relevantCols))) %>%
filter(n > 1)
# a c n
#1 1 1 2
#2 2 2 2
是否有可靠的方法来使用包含与数据框列名称对应的字符串列表的变量,以传递给各种 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
步骤,而不是明确命名每个列。但是,我还没有找到足够强大的 easy/convenient 方法来处理多个 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
操作的列名列表创建变量,而不是一遍又一遍地重新输入每个列名
我们可以使用 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
查看dplyr编程指南并创建一个函数并使用embrace函数,{{ }}
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)
我们可以使用 dplyr
中的 across
,而无需使用任何其他包
library(dplyr)
df %>%
count(across(all_of(relevantCols))) %>%
filter(n > 1)
# a c n
#1 1 1 2
#2 2 2 2