【问题标题】:List of lists R, extract lists containing same multiple elements列表 R 的列表,提取包含相同多个元素的列表
【发布时间】: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

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

我将能够将我的查询划分为其组件(例如,首先提取包含阿姆斯特丹的查询,然后提取包含巴黎的查询,然后找到结果的交集)但是,这将变得耗时且难以使用循环来实现和读取。

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

# 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


【解决方案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

现在解决您的问题。我想你想在列表中找到包含 allexact 元素 在其他一些向量中的向量,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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    相关资源
    最近更新 更多