简单,直观的表达式,用于按顺序查找名称包含两个字符串的数据框的所有列

时间:2016-02-02 14:27:24

标签: regex r

示例数据框:

df=data.frame(foobar=0,foosssbar=1,barsssfooss=2,sssfoobar=3,foorrr_bar329=4, babar=5,foofoo=6)

我只想选择以foo开头且包含bar的列。我发现这有效:

df1=df[,grepl("^foo.*?bar",colnames(df))]

但我想知道是否有更简单的方法,特别是不使用正则表达式的方法。使用dplyrstringr等软件包的解决方案是受欢迎的,如果它们比我的简单。

2 个答案:

答案 0 :(得分:2)

这是否“更容易”很难说(主观!)但是这里是你如何使用dplyr:

library(dplyr)
select(df, intersect(starts_with("foo"), contains("bar")))
#  foobar foosssbar foorrr_bar329
#1      0         1             4

当然,您也可以使用现有的正则表达式和dplyr函数:

select(df, matches("^foo.*?bar"))
#  foobar foosssbar foorrr_bar329
#1      0         1             4

答案 1 :(得分:0)

使用str_detect,您可以使用str_locatedf[, str_locate(colnames(df),"foo")[, 1] %in% 1 & str_detect(colnames(df),"bar")] ,但正如David已经评论过的那样,它更长更复杂:

{{1}}

使用locate函数,您可以找到开头位置为“foo”的列,并按照类似于1的起始位置进行子集化。然后搜索“bar”。