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

时间:2017-03-08 23:03:07

标签: r pattern-matching nested-lists

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

我需要的是能够根据它们包含的多种模式(例如CitiesACitiesC)从整个列表中提取列表(例如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术语可能非常相似,如果我可以匹配完整查询,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

看来你有这样一个对象:

# 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")
)

(注意结构如何清晰,任何人都可以将其复制/粘贴到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

现在你的问题。我想你想在列表中找到包含精确元素 all 的向量,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"