如何通过匹配部分名称从列表中删除元素?

时间:2017-11-22 17:50:24

标签: r list

我有一个列表:

    foo<- list(c("foob.10.27808", "foob.11.31809","foob.12.35810","foob.13.39811", 
         "foob.14.43812", "foob.15.47813", "foob.16.51814", "foob.17.<NA>", 
         "foob.5.7803", "foob.6.11804", "foob.7.15805", "foob.8.19806", 
         "foob.9.23807")     

现在我要删除名为"foob.17.<NA>的对象。如果我想像foo$foob.17.<NA><-NULL那样手动操作,或者如果我想知道它的名字是什么,这应该没有问题,但首先我不想手动(当然不是)),其次,在每种情况下我都不知道它的名字。 这些列表是在函数内创建的,因此我所知道的唯一部分名称是".<NA>"

有没有办法只通过将其与".<NA>"匹配来找到名称,然后将其删除?就像使用rm(list=ls(pattern="foo"))的环境元素一样?

提前谢谢。

祝你好运, 克里斯

1 个答案:

答案 0 :(得分:3)

实际上foo$"foob.17.<NA>" <- NULL无效,因为该列表中没有名称为"ffoob.17.<NA>"的组件。该列表只有一个组件,该组件包含一个字符向量。

可以使用

grep

list(grep(".<NA>", foo[[1]], value = TRUE, invert = TRUE, fixed = TRUE))

## [[1]]
##  [1] "foob.10.27808" "foob.11.31809" "foob.12.35810" "foob.13.39811"
##  [5] "foob.14.43812" "foob.15.47813" "foob.16.51814" "foob.5.7803"  
##  [9] "foob.6.11804"  "foob.7.15805"  "foob.8.19806"  "foob.9.23807" 

如果您打算在下面显示foo2的地方写foo2,那么我们可以使用Filter

foo2 <- as.list(foo[[1]])
Filter(function(x) !grepl(".<NA", x, fixed = TRUE), foo2)

或者如果你的意思是你有一个名字是字符向量foo[[1]]的列表,如下所示:

foo3 <- setNames(as.list(seq_along(foo[[1]])), foo[[1]])
foo3[ grep(".<NA>", names(foo3), invert = TRUE, fixed = TRUE) ]

注意: foo在问题中有不平衡的括号,所以在这里它是可重复的形式,并修复了:

foo<- list(c("foob.10.27808", "foob.11.31809","foob.12.35810","foob.13.39811", 
         "foob.14.43812", "foob.15.47813", "foob.16.51814", "foob.17.<NA>", 
         "foob.5.7803", "foob.6.11804", "foob.7.15805", "foob.8.19806", 
         "foob.9.23807"))