【问题标题】:Have select in dplyr use more than one patterns to match在 dplyr 中选择使用多个模式进行匹配
【发布时间】:2015-09-04 16:20:54
【问题描述】:

我的目标是从 mydata 中选择几个包含特定模式的列。

mydata <- data.frame(q1 = rnorm(10), q10 = rnorm(10), q12 = rnorm(10), q20 = rnorm(10))

方法 1 - 使用 grep - 以简约的方式完成我所需要的:

myvars <- names(mydata)[grep("^q10|^q12", names(mydata))]
temp <- mydata[myvars]
tbl_df(temp)

我正在尝试纯粹在 dplyr 中进行。但是,我没有发现比以下更简洁的东西(比如在 grep 中):

temp <- cbind(select(mydata, starts_with("q10")), select(mydata, starts_with("q12")))
tbl_df(temp)

代码太多了。我怎样才能使它与“|”一起使用?我尝试了以下方法,但都不起作用:

select(mydata, starts_with("q10|q12"))
select(mydata, starts_with(c("q10","q12")))
temp <- select(mydata, starts_with("q10","q12"))
select(mydata, starts_with(c("q10"))|starts_with(c("q12")))

建议? 谢谢!

【问题讨论】:

  • 吝啬意味着吝啬或节俭顺便说一句
  • @PierreLafortune parsimonious 也意味着简单、不复杂(至少对生物学家而言)
  • Stack Overflow,您的一站式代码和词汇商店。
  • 如果以下答案对您有用,请考虑单击复选标记以接受它。您也可以为此获得积分。

标签: r regex dplyr


【解决方案1】:

select() 帮助文件中,我了解到唯一接受正则表达式的特殊内部函数是matches()。您可以使用正则表达式^q1(0|2)从名称的开头开始,并将q102匹配。

select(mydata, matches("^q1(0|2)"))
#            q10        q12
# 1  -0.97766671  1.2691732
# 2  -1.17397582 -0.8175758
# 3  -1.98684643  0.1117284
# 4   1.12142980  0.5737528
# 5   0.41680505  0.8974448
# 6   1.47558382 -1.5122752
# 7   0.39651297 -0.5282083
# 8  -0.13266148  0.8281671
# 9  -0.66982395  0.1239249
# 10  0.06119857 -0.3484675

【讨论】:

  • 如果不是q10和q12而是q10和ABC13怎么办?
  • 那么正则表达式可能就是^(q10|ABC13)
  • 我想我明白了:select(mydata, matches("^q10|^q12")) 谢谢大家!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多