【问题标题】:Dplyr select based on multiple strings in a column基于列中多个字符串的 Dplyr 选择
【发布时间】:2018-03-24 02:12:46
【问题描述】:

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

 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”的列?

【问题讨论】:

  • 能否请您告诉我们您的预期输出。
  • 输出 data.frame 应该只包含列:- a_b_c 和 c_b_a。因为这两列都包含字符串“a”和字符串“c”。
  • 是的,它只包含列。

标签: r regex dplyr


【解决方案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。带有两个 a 和两个 c 的列名也不会被选择,如 var 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
)

【讨论】:

  • 这正是我想要的。谢谢。
  • Np,很乐意为您提供帮助
【解决方案2】:

试试df %&gt;% 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

【讨论】:

  • 似乎 OP 可能要求出现两个字母,因为它们说“a 和 c”,而不是“a 或 c”。不过,他们还没有澄清……
  • 我想得到它的“a”和“c”。
  • @MadhukarJha 我猜是df %&gt;% select(intersect(contains("a"), contains("c")))
【解决方案3】:

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

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') 

【讨论】:

  • 很高兴看到一些更简单的东西,即使用本机函数,但这可以解决问题。
【解决方案4】:

希望这是您正在寻找的:

  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" )]

【讨论】:

  • 不,我看的不是这个。
  • 好的,请您写下您的预期输出。
  • "在您的示例中,您可以使用:y
  • 你的意思是你想要它作为一般。好的。
猜你喜欢
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2018-02-19
  • 2021-11-24
  • 2012-02-21
相关资源
最近更新 更多