列表列表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
我需要的是能够根据它们包含的多种模式(例如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 术语可能非常相似,如果我可以匹配完整查询,我将不胜感激。
好的。将来,请努力格式化您的问题——这真是一团糟——并使其可重现。
看来您有这样一个对象:
# 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"
我有一个在 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
)从整个列表。
我可以将我的查询划分成它的组成部分(例如,首先提取包含阿姆斯特丹的部分,然后是巴黎,然后找到结果的交集)但是,这会很耗时并且难以使用循环实现和读取.
如果您能告诉我更简单的解决方案,我将不胜感激。 以下是我迄今为止尝试过的一些示例,但没有给我正确的结果;
# 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"