【问题标题】:Remove entire list elements which contain a certain string删除包含某个字符串的整个列表元素
【发布时间】:2015-05-25 10:11:37
【问题描述】:

var1 是一个列表:

var1 <- list(c("tall tree", "fruits", "star"),  
             c("tree tall", "pine tree", "tree pine", "black forest", "water"), 
             c("apple", "orange", "grapes"), 
             c("ancient pine tree", "all trees"))

我需要从包含术语“pine”的列表中完全删除这些元素。

想要的答案是一个列表:

[[1]]
[1] "tall tree" "fruits"    "star"    
[[2]]
[1] "apple"  "orange" "grapes"

谢谢

【问题讨论】:

    标签: r list


    【解决方案1】:

    你可以在这里试试Filter

    Filter(function(x) !any(grepl("pine", x)), var1)
    # [[1]]
    # [1] "tall tree" "fruits"    "star"     
    # 
    # [[2]]
    # [1] "apple"  "orange" "grapes"
    

    【讨论】:

      【解决方案2】:
      var1[lapply(var1,function(x) length(grep("pine",x,value=FALSE))) == 0]
      

      【讨论】:

        【解决方案3】:

        这是一个老问题,但我想我会添加另一个选项。 stringr 包中的“str_”函数非常适合列表中的模式匹配。

        如果您要查找所有匹配的列表条目,您可以使用:

        library(stringr)
        str_subset(var1,pattern="pine")
        

        但由于您想要列出 匹配的条目,您可以使用:

        library(stringr)
        var1[!str_detect(var1,pattern="pine")]
        

        str_detect(list,pattern) 返回一个逻辑列表,因此您可以使用倒数 (!) 将列表子集为与模式不匹配的条目。

        【讨论】:

          【解决方案4】:

          另外一个可以执行:

           var2<-lapply(var1,function(x) if(all(grepl(pattern = "^(?!.*pine).*$",x,perl = T)==T)) return(x) else NA);var2[!is.na(var2)]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-03-15
            • 2012-05-15
            • 1970-01-01
            • 2017-09-28
            • 1970-01-01
            • 2018-11-18
            • 1970-01-01
            相关资源
            最近更新 更多