grep在R中的列表中的向量中完全匹配

时间:2017-04-08 20:56:50

标签: r regex match

我有一个这样的清单:

map_tmp <- list("ABC",
                c("EGF", "HIJ"),
                c("KML", "ABC-IOP"),
                "SIN",
                "KMLLL")


> grep("ABC", map_tmp)
[1] 1 3
> grep("^ABC$", map_tmp)
[1] 1  # by using regex, I get the index of "ABC" in the list
> grep("^KML$", map_tmp)
[1] 5  # I wanted 3, but I got 5. Claiming the end of a string by "$" didn't help in this case.
> grep("^HIJ$", map_tmp)
integer(0) # the regex do not return to me the index of a string inside the vector

如何在列表中获取字符串索引(完全匹配)? 我没有使用grep。有没有办法在列表中获取某个字符串的索引(完全匹配)?谢谢!

3 个答案:

答案 0 :(得分:1)

使用mapply或Map str_detect来查找位置,我只运行一个字符串&#34; KML &#34; ,你可以为所有其他人运行它。我希望这有用。

首先,我们制作清单,以便我们可以轻松处理

library(stringr)
map_tmp_1 <- lapply(map_tmp, `length<-`, max(lengths(map_tmp)))
### Making the list even 
val <- t(mapply(str_detect,map_tmp_1,"^KML$"))

 > which(val[,1] == T)
[1] 3

 > which(val[,2] == T)
integer(0)

如果&#34; ABC &#34;字符串:

val <- t(mapply(str_detect,map_tmp_1,"ABC"))
> which(val[,1] == T)
[1] 1
> which(val[,2] == T)
[1] 3
> 

答案 1 :(得分:0)

使用lapply:

which(lapply(map_tmp, function(x) grep("^HIJ$", x))!=0)

lapply函数为您提供列表中每个元素的列表(如果没有匹配,则为0)。 which!=0函数为您提供列表中出现字符串的元素。

答案 2 :(得分:0)

我有同样的问题。我无法解释为什么grep在带有字符而不是正则表达式的列表中能很好地工作。无论如何,我发现使用常见的R脚本匹配字符串的最佳方法是:

map_tmp <- list("ABC",
                c("EGF", "HIJ"),
                c("KML", "ABC-IOP"),
                "SIN",
                "KMLLL")    
sapply( map_tmp , match  , 'ABC' )

根据匹配测试的结果,它返回与“ NA”或“ 1”的输入具有相似结构的列表:

[[1]]
[1] 1

[[2]]
[1] NA NA

[[3]]
[1] NA NA

[[4]]
[1] NA

[[5]]
[1] NA