【发布时间】:2017-03-08 23:03:07
【问题描述】:
我有一个在 R 中定义的列表列表。手动检查非常大,因此我制作了一个小副本,以便能够以有效的方式提供我想要询问的内容。
>listOfLists
$CitiesA
$CitiesA[[1]]
[1]Paris
[2]Amsterdam
[3]Istanbul
[4]Vienna
$CitiesB
$CitiesB[[1]]
[1]Amsterdam
[2]Stockholm
[3]Barcelona
[4]Lisbon
[5]Vienna
$CitiesC
$CitiesC[[1]]
[1]Vienna
[2]Budapest
[3]Amsterdam
[4]Paris
我需要的是能够根据列表中包含的多种模式(例如Paris 和Amsterdam)从整个列表中提取列表(例如CitiesA 和CitiesC)。
我将能够将我的查询划分为其组件(例如,首先提取包含阿姆斯特丹的查询,然后提取包含巴黎的查询,然后找到结果的交集)但是,这将变得耗时且难以使用循环来实现和读取。
如果您能告诉我一个更简单的解决方案,我将不胜感激。 以下是我迄今为止尝试过的一些示例,但没有给我正确的结果;
# toMatch <- c(Paris,Amsterdam)
# res <- lapply(listOfLists, function(x)grepexpr(toMatch,x)
# res <- lapply(listOfLists, function(x)match(toMatch,x)
我很乐意保留 listOfLists[['CitiesA']] | listOfLists$CitiesA 子集功能,但如果有更好的方法来表示这些数据,我将不胜感激您的意见。
作为输出,我只需要包含共享多个模式的对象的名称,如下所示;
result <- "pseudoCodeToExtractObjects"
names(result)
[1] CitiesA [2] CitiesC
对于模式匹配;我对完整模式匹配或模式子集都很好,但由于 GO 术语可能非常相似,如果我能匹配完整查询,我将不胜感激。
【问题讨论】:
-
您说的是“列表列表”,但它看起来像一个向量列表。您能否以可重现的方式分享您的示例数据(创建对象的代码或
dput())? -
很抱歉造成混乱!那是我的对象的一个子集 这是一个样本对象结构的 dput() 输出(list(RALYL = list(c(“核苷酸结合(GO:0000166)”,“核酸结合(GO:0003676)”,“蛋白质结合(GO:0005515)”,“相同的蛋白质结合(GO:0042802)”,“聚(A)RNA结合(GO:0044822)”,“RNA结合(GO:0003723)”)),BNIPL = list( c(“蛋白质结合(GO:0005515)”,“相同的蛋白质结合(GO:0042802)”)),SCARB2 = list(c(“受体活性(GO:0004872)”,“病毒受体活性”,“蛋白质结合", "酶结合")),Names = c("RALYL", "BNIPL", "SCARB2"))
-
另外,请为此对象提供示例输入和所需结果。并请澄清匹配是否相同或包含。例如,搜索字符串是“核苷酸结合(GO:0000166)”之类的,还是“GO:000”之类的部分字符串?
-
而且,您的
dput实际上是一个列表列表,但它似乎不需要,因为每个子列表只有一个向量。是否可以简化为向量列表,或者您的真实数据实际上是否需要嵌套?
标签: r pattern-matching nested-lists