在 select (dplyr) 中使用多个条件

1 select r dplyr

我想dplyr::select()使用contains()多个列来选择数据帧的某些列。我知道还有其他方法可以解决它,但我想知道这在内部是否可能select()一个例子:

df <- data.frame(column1= 1:10, col2= 1:10, c3= 1:10)
library(dplyr)
names(select(df, contains("col") & contains("1")))
Run Code Online (Sandbox Code Playgroud)

这给出了一个错误,但我希望该函数给出"column1".

我期望这select()将允许类似的方法,filter()我们可以使用运算符设置多个条件,即类似filter(df, column1 %in% 1:5 & col2 != 2).

编辑

我注意到我的问题更为笼统,我想知道是否可以在select()、 likeselect(df, contains("1") | !starts_with("c"))等中传递任何组合。但不知道如何实现这样的功能。

Mat*_*att 6

您可以使用select_ifgrepl

library(dplyr)

df %>% 
select_if(grepl("col", names(.)) & grepl(1, names(.)))


#   column1
#1        1
#2        2
#3        3
#4        4
#5        5
#6        6
#7        7
#8        8
#9        9
#10      10
Run Code Online (Sandbox Code Playgroud)

如果你想使用selectwithcontains你可以这样做:

df %>% 
select(intersect(contains("col"), contains("1")))
Run Code Online (Sandbox Code Playgroud)

这可以通过其他方式组合,如评论中所述:

df %>% 
select(intersect(contains("1"), starts_with("c")))
Run Code Online (Sandbox Code Playgroud)

  • `intersect` 表示 AND,`union` 表示 OR,`setdiff` 表示 AND NOT,例如,`select(df, setdiff(contains("1"),starts_with("c")))` 包含 1 并且不包含 1 t 以 c 开头。`select(df, union(contains("1"),starts_with("c")))` for contains 1 OR 以 c 开头。 (2认同)