列表列表R,提取包含相同多个元素的列表

List of lists R, extract lists containing same multiple elements

我有一个在 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

我需要的是能够根据它们包含的多种模式(例如ParisAmsterdam)从整个列表。

我可以将我的查询划分成它的组成部分(例如,首先提取包含阿姆斯特丹的部分,然后是巴黎,然后找到结果的交集)但是,这会很耗时并且难以使用循环实现和读取.

如果您能告诉我更简单的解决方案,我将不胜感激。 以下是我迄今为止尝试过的一些示例,但没有给我正确的结果;

# 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 术语可能非常相似,如果我可以匹配完整查询,我将不胜感激。

好的。将来,请努力格式化您的问题——这真是一团糟——并使其可重现。

看来您有这样一个对象:

# list of lists
lol = list(
    CitiesA = list(c("Paris", "Amsterdam", "Istanbul", "Vienna")),
    CitiesB = list(c("Amsterdam", "Stockholm", "Barcelona", "Lisbon", "Vienna")),
    CitiesC = list(c("Vienna", "Budapest", "Amsterdam", "Paris"))
)

但是因为每个子列表只有一个向量,所以有一个像这样的对象会更简单:

# list of vectors:
lov = list(
    CitiesA = c("Paris", "Amsterdam", "Istanbul", "Vienna"),
    CitiesB = c("Amsterdam", "Stockholm", "Barcelona", "Lisbon", "Vienna"),
    CitiesC = c("Vienna", "Budapest", "Amsterdam", "Paris")
)

(请注意结构是多么清晰,任何人都可以将其 copy/paste 放入 R 中并获得相同的对象。像这样的内容应该包含在您的问题中。)

区别在于外部列表是否包含向量,或者外部列表是否包含内部列表然后包含向量。使用列表列表的唯一原因是子列表需要包含 多个 向量。您的子列表都包含 正好 1 个向量,因此它们毫无意义。

## This is nice
lov$CitiesA
# [1] "Paris"     "Amsterdam" "Istanbul"  "Vienna"   

class(lov$CitiesA)
# [1] "character"

## This is harder to work with
lol$CitiesA
# [[1]]
# [1] "Paris"     "Amsterdam" "Istanbul"  "Vienna"   

class(lol$CitiesA)
# [1] "list"

矢量列表将更易于使用。将列表列表转换为向量列表很容易:

lov2 = lapply(lol, unlist)
identical(lov, lov2)
# [1] TRUE

现在解决你的问题。我认为您想在列表中找到包含 全部 的向量 精确元素 在其他向量 toMatch 中:

toMatch = c("Paris", "Amsterdam")

## We can get the results for each element of the list
lapply(lov, function(x) all(toMatch %in% x))
# $CitiesA
# [1] TRUE
# 
# $CitiesB
# [1] FALSE
# 
# $CitiesC
# [1] TRUE

## or just look at the subset of names that meet the criteria
names(lov)[sapply(lov, function(x) all(toMatch %in% x))]
# [1] "CitiesA" "CitiesC"