从字符向量中提取特定元素

时间:2019-01-16 06:12:25

标签: r regex string

我有一个字符向量

a=c("Mom", "mother", "Alex", "Betty", "Prime Minister")

我只想提取以“ M”开头的单词(上下两个字母)

该怎么做?

我尝试使用grep()sub()和此函数的其他变体,但是我做错了。

我希望输出是“妈妈”和“母亲”的字符向量

5 个答案:

答案 0 :(得分:2)

a[startsWith(toupper(a), "M")]

答案 1 :(得分:2)

普通grep也可以

grep( "^m", a, ignore.case = TRUE, value = TRUE )
#[1] "Mom"    "mother"

基准
汤姆的答案(startsWith)是赢家,但是还有一些改进的余地(请检查startsWith2的代码)

microbenchmark::microbenchmark(
  substr = a[substr(a, 1, 1) %in% c("M", "m")],
  grepl = a[grepl("^[Mm]", a)],
  grep = grep( "^m", a, ignore.case = TRUE, value = TRUE ),
  stringr = unlist(stringr::str_extract_all(a,regex("^M.*",ignore_case = T))),
  startsWith1 = a[startsWith(toupper(a), "M")],
  startsWith2= a[startsWith(a, c("M", "m"))]
)


# Unit: nanoseconds
#        expr   min      lq     mean median    uq    max neval
#      substr  1808  2411.0  3323.19   3314  3917   8435   100
#       grepl  3916  4218.0  5438.06   4820  6930   8436   100
#        grep  3615  4368.5  5450.10   4820  6929  19582   100
#     stringr 50913 53023.0 55764.10  54529 55132 174432   100
# startsWith1  1506  2109.0  2814.11   2711  3013  17474   100
# startsWith2   602  1205.0  1410.17   1206  1507   3013   100

答案 2 :(得分:1)

使用grepl,其模式为^[Mm]

a[grepl("^[Mm]", a)]

[1] "Mom"    "mother"

^[Mm]模式的含义如下:

^      from the start of the string
[Mm]   match either a lowercase or uppercase letter M

grepl函数的工作原理是断言输入模式至少匹配一次,因此我们不必关心字符串的其余部分。

答案 3 :(得分:1)

使用md-contact-chips

stringr

答案 4 :(得分:0)

substr是一个非常易于处理的基本R函数:

a[substr(a, 1, 1) %in% c("M", "m")]

# [1] "Mom"    "mother"

由于您提到了sub(),所以您可以做(尽管不一定推荐):

a[sub("(.).*", "\\1", a) %in% c("M", "m")]