我有一个在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
我需要的是能够根据它们包含的多种模式(例如CitiesA
和CitiesC
)从整个列表中提取列表(例如Paris
和Amsterdam
) 。
我能够将我的查询分区为其组件(例如;首先提取包含阿姆斯特丹的那些,然后是巴黎,然后找到结果的交叉点)然而,这将花费时间并且难以实现并且使用循环读取。
如果您能告诉我更简单的解决方案,我将不胜感激。 以下是我到目前为止所尝试的一些例子,它们没有给我正确的结果;
# 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术语可能非常相似,如果我可以匹配完整查询,我将不胜感激。
答案 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"