我有一个列表:
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"))
的环境元素一样?
提前谢谢。
祝你好运, 克里斯
答案 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"))