示例数据框:
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))]
但我想知道是否有更简单的方法,特别是不使用正则表达式的方法。使用dplyr
或stringr
等软件包的解决方案是受欢迎的,如果它们比我的简单。
答案 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_locate
和df[, str_locate(colnames(df),"foo")[, 1] %in% 1 & str_detect(colnames(df),"bar")]
,但正如David已经评论过的那样,它更长更复杂:
{{1}}
使用locate函数,您可以找到开头位置为“foo”的列,并按照类似于1的起始位置进行子集化。然后搜索“bar”。