这是一个玩具的例子。我想在a
内搜索并提取b
中列出的颜色。即使颜色不是以大写字母开头,我也想提取它。但是,输出应该告诉我a
中的颜色是如何使用的。
所以我想得到的答案是#"Red" NA "blue
。
a <- "She has Red hair and blue eyes"
b <- c("Red", "Yellow", "Blue")
str_extract(a, b)#"Red" NA NA
我使用了'stringr'中的str_extract
,但很乐意使用其他功能/包(例如grep
)。
答案 0 :(得分:4)
我们可以执行此操作base R
unlist(sapply(tolower(b), function(x) {
x1 <- regmatches(a, gregexpr(x, tolower(a)))
replace(x1, x1 == "character(0)", NA)}), use.names=FALSE)
# "Red" NA "blue"
或者从@ leerssej的回答中获得启发
library(stringr)
str_extract(a, fixed(b, ignore_case=TRUE))
#[1] "Red" NA "blue"
答案 1 :(得分:4)
stringr有一个 ignore.case() 函数
str_extract(a, ignore.case(b))#"Red" NA "blue"
答案 2 :(得分:4)
使用stringi
可以使用不区分大小写的选项
library(stringi)
stri_extract_all_fixed(a, b, opts_fixed = list(case_insensitive = TRUE))
#[[1]]
#[1] "Red"
#[[2]]
#[1] NA
#[[3]]
#[1] "blue"
# or using simplify = TRUE to get a non-list output
stri_extract_all_fixed(a, b, opts_fixed = list(case_insensitive = TRUE),
simplify = TRUE)
# [,1]
#[1,] "Red"
#[2,] NA
#[3,] "blue"
答案 3 :(得分:2)
作为对akrun答案的改进,您可以使用大小写的更改进行匹配,但仍然按照a
中最初编写的方式返回元素:
library(stringr)
a <- "She has Red hair and blue eyes"
b <- c("Red", "Yellow", "Blue")
positions <- str_locate(toupper(a), toupper(b))
apply(positions, 1, function(x) substr(a,x[1],x[2]))
## [1] "Red" NA "blue"
或者,消除NA ......
positions <- str_locate(toupper(a), toupper(b))
words <- apply(positions, 1, function(x) substr(a,x[1],x[2]))
words[!is.na(words)]
## [1] "Red" "blue"