Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将dplyr操作与列名称的字符串列表一起使用_R_String_Dplyr_Multiple Columns - Fatal编程技术网

如何将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编程”的小插曲。