Dplyr基于列中的多个字符串进行选择

时间:2018-03-24 02:12:47

标签: r regex dplyr

我有一个包含以下列的数据框: -

 sample.data


 a_b_c d_b_e r_f_g c_b_a
1     1     1     1     1
2     2     2     2     2
3     3     3     3     3
4     4     4     4     4

如何仅选择包含列名称中的“a”和“c”的列?

4 个答案:

答案 0 :(得分:1)

尝试df %>% dplyr::select(matches("(a|c)"))

library(dplyr)
df <- data.frame(
  a_b_c=1:4,
  d_b_e=1:4,
  r_f_g=1:4,
  c_b_a=1:4
)

结果

> df %>% dplyr::select(matches("(a|c)"))
  a_b_c c_b_a
1     1     1
2     2     2
3     3     3
4     4     4

答案 1 :(得分:1)

要选择包含ac的变量,我们可以这样做:

library(dplyr)

df %>% 
  select(matches("(a.*c)|(c.*a)"))
  a_b_c c_b_a
1     1     1
2     2     2
3     3     3
4     4     4

请注意,未选择var a_a_e,因为它不包含c,并且未选择var c_f_g,因为它不包含a。如var a所示,将不会选择包含两个c和两个a_a_e的列名。

我们也可以使用str_subset

library(dplyr)
library(stringr)

df %>% 
  select(str_subset(names(df), "(a.*c)|(c.*a)"))

数据:

df <- data.frame(
  a_b_c = 1:4,
  a_a_e = 1:4,
  c_f_g = 1:4,
  c_b_a = 1:4
)

答案 2 :(得分:0)

希望这就是你要找的东西:

  a_b_c <- c(1,2,3,4)
     d_b_e <- c(1,2,3,4)
    yy <- cbind(a_b_c, d_b_e)
    > yy
     a_b_c d_b_e
[1,]     1     1
[2,]     2     2
[3,]     3     3
[4,]     4     4
 yy <- as.data.frame(yy)
 yy
  a_b_c d_b_e
1     1     1
2     2     2
3     3     3
4     4     4
 y <- yy[which(names(yy) %in% "a_b_c")]
> y
  a_b_c
1     1
2     2
3     3
4     4

在您的示例中,您可以使用:

 y <- sample.data[which(names(sample.data) %in% c("a_b_c","c_b_a" )]

答案 3 :(得分:0)

如果您想了解它的工作原理,请使用以下功能

contain_both <- function(data_frame, letter_a, letter_b) {
    j <- 0
    keep_columns <- NULL
    for(i in 1:ncol(data_frame)) {
    has_letters <- unlist(strsplit(names(data_frame)[i], '_'))
    if(is.element(letter_a, has_letters) && is.element(letter_b, has_letters)) {
    j <- j + 1
    keep_columns[j] <- i
    }
    }
    return(data_frame[, keep_columns])
    }

数据

df <- data.frame(seq(1:4), seq(1:4), seq(1:4), seq(1:4))
names(df) <- c('a_b_c', 'd_b_e', 'r_f_g', 'c_b_a')

只需传递数据框,以及 2个字母选项

<强>用法

contain_both(df, 'b', 'c') 

enter image description here