我有一个字符向量
a=c("Mom", "mother", "Alex", "Betty", "Prime Minister")
我只想提取以“ M”开头的单词(上下两个字母)
该怎么做?
我尝试使用grep()
,sub()
和此函数的其他变体,但是我做错了。
我希望输出是“妈妈”和“母亲”的字符向量
答案 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")]