grep exact match in vector inside a list in R

扶醉桌前 提交于 2021-02-05 08:14:09

问题


I have a list like this:

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

How can I get the index of a string (exact match) in the list? I'm ok not to use grep. Is there any way to get the index of a certain string (exact match) in the list? Thanks!


回答1:


Use either mapply or Map with str_detect to find the position, I have run only for one string "KML" , you can run it for all others. I hope this is helpful.

First of all we make the lists even so that we can process it easily

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)

In case of "ABC" string:

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



回答2:


Using lapply:

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

The lapply function gives you a list of which for each element in the list (0 if there's no match). The which!=0 function gives you the element in the list where your string occurs.




回答3:


I had the same question. I cannot explain why grep would work well in a list with characters but not with regex. Anyway, the best way I found to match a character string using common R script is:

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

It returns a list with similar structure as the input with 'NA' or '1', depending on the result of the match test:

[[1]]
[1] 1

[[2]]
[1] NA NA

[[3]]
[1] NA NA

[[4]]
[1] NA

[[5]]
[1] NA


来源:https://stackoverflow.com/questions/43300281/grep-exact-match-in-vector-inside-a-list-in-r

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!