如何将dplyr操作与列名称的字符串列表一起使用
是否有一种可靠的方法来使用包含与数据帧列名对应的字符串列表的变量,以传递给各种如何将dplyr操作与列名称的字符串列表一起使用,r,string,dplyr,multiple-columns,R,String,Dplyr,Multiple Columns,是否有一种可靠的方法来使用包含与数据帧列名对应的字符串列表的变量,以传递给各种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
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
操作中重新键入'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)
图书馆(rlang)
相关COLS%
计数(!!!符号(相关列))%>%
过滤器(n>1)
#a c n
#1 1 1 2
#2 2 2 2
我们可以将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)
图书馆(rlang)
相关COLS%
计数(!!!符号(相关列))%>%
过滤器(n>1)
#a c n
#1 1 1 2
#2 2 2 2
请参阅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)
库(dplyr)
#创建数据帧
df%
计数({1},{2}})%>%
过滤器(n>1)
}
dupcol(df、a、c)
请参阅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)
库(dplyr)
#创建数据帧
df%
计数({1},{2}})%>%
过滤器(n>1)
}
dupcol(df、a、c)
我们可以从dplyr
跨使用,而无需使用任何其他软件包
library(dplyr)
df %>%
count(across(all_of(relevantCols))) %>%
filter(n > 1)
# a c n
#1 1 1 2
#2 2 2 2
我们可以从dplyr
跨使用,而无需使用任何其他软件包
library(dplyr)
df %>%
count(across(all_of(relevantCols))) %>%
filter(n > 1)
# a c n
#1 1 1 2
#2 2 2 2
我认为罗纳克的回答是好的。它不需要定义新函数。此外,我看不出您提供的函数如何绕过我的问题-您的解决方案是在多个位置重新键入“{one},{two}”,而不是在多个位置重新键入“a,c”(函数定义)。我遗漏了什么吗?看起来整洁的诗句正在远离syms
和代码>并移动到大括号。我建议回去阅读“用dplyr编程”的小插曲。我认为Ronak的答案是更好的。它不需要定义新函数。此外,我看不出您提供的函数如何绕过我的问题-您的解决方案是在多个位置重新键入“{one},{two}”,而不是在多个位置重新键入“a,c”(函数定义)。我遗漏了什么吗?看起来整洁的诗句正在远离syms
和代码>并移动到大括号。我建议回去阅读“用dplyr编程”的小插曲。