我有一个字符向量列表,我想使用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
感谢您的帮助!
答案 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