从R中的字符串中提取模式,而不区分大写和小写字母

时间:2016-06-14 03:16:38

标签: r string extract

这是一个玩具的例子。我想在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)。

4 个答案:

答案 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"