字符向量列表中不匹配的字符串的索引

时间:2019-02-05 04:34:33

标签: r

我有一个字符向量列表,我想使用grep命令查找不匹配项的位置。请参见下面的示例:

x.lst <- list()
x.lst[[1]] <- c("she", "said", "hello")
x.lst[[2]] <- c("hello")
x.lst[[3]] <- c("whats", "up")

我想要一个函数返回每个向量中不匹配模式的索引。在我的示例中,返回除“ hello”以外的所有内容的索引。如果我使用以下内容:

lapply(x.lst, function(x) x[-grep("hello",x)])

我得到:

[[1]]
[1] "she"  "said"

[[2]]
character(0)

[[3]]
character(0) 

所需的输出是:

[[1]]
[1] 1    2

[[2]]
[1] character(0)

[[3]]
[1] 1    2 

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

使用invert = TRUE返回不匹配元素的索引。

lapply(x.lst, function(x) grep("hello",x, invert = TRUE))

#[[1]]
#[1] 1 2

#[[2]]
#integer(0)

#[[3]]
#[1] 1 2

一种tidyverse替代方式

library(tidyverse)
map(x.lst, ~ setdiff(seq_along(.), str_which(., "hello")))
#You can always do same as base here as well
#map(x.lst, ~ grep("hello",., invert = TRUE))

#[[1]]
#[1] 1 2

#[[2]]
#integer(0)

#[[3]]
#[1] 1 2

答案 1 :(得分:1)

来自Map的{​​{1}}的一个选项

base R

或使用unname(Map(grep, pattern = "hello", x.lst, invert = TRUE))

tidyverse