我有一个这样的清单:
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
。有没有办法在列表中获取某个字符串的索引(完全匹配)?谢谢!
答案 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