R使用逻辑向量从列表中选择名称

时间:2012-10-15 11:08:20

标签: r list vector

假设我的list包含名称及其组件,我想获得那些在其他向量中包含其组件的名称:

这是我的列表邻居

neighbors[[1]]
 [1] "CNBP"                  "IGF2BP1"               "RPL3|OK/SW-cl.32"     
 [4] "HNRNPC"                "PURA|hCG_45299"        "RPS3A"                
         "Cnbp"                  "Mis12|DN-393H17.5"    
neighbors[[2]]
[1] "NIN"                "PRKACA"             "AURKA|RP5-1167H4.6"
[4] "GSK3B"              "AMOT"               "UBC"

和我感兴趣的载体      mtop

[1] "TUBA1A"                "DNAJB1"                "MME"                  
[4] "PRKCB"                 "PARK2|KB-152G3.1"      "UBC" 

我的想法是返回neighbors[2]的名称,它具有共同的UBC

任何想法??

2 个答案:

答案 0 :(得分:2)

首先,您的数据。你的输出看起来很奇怪。如果这不是您所拥有的,请考虑使用dput以可重现的方式转储这些变量。

mtop <- c("TUBA1A", "DNAJB1", "MME",
          "PRKCB", "PARK2|KB-152G3.1", "UBC")
neighbors <- list(c("CNBP", "IGF2BP1", "RPL3|OK/SW-cl.32",
                    "HNRNPC", "PURA|hCG_45299", "RPS3A",
                    "Cnbp", "Mis12|DN-393H17.5"),
                  c("NIN", "PRKACA", "AURKA|RP5-1167H4.6",
                    "GSK3B", "AMOT", "UBC"))

要选择列表neighbors中至少有一个与mtop共同的向量元素的元素,您可以使用以下命令:

matching <- sapply(neighbors, function(l) length(intersect(mtop, l)) > 0)
print(neighbors[matching])

这将打印neighbors[2],因为它"UBC"mtop相同。它通过逻辑向量matching完成此操作。这似乎是你的问题所在。

如果您想考虑位置,即只选择neighbors[2]因为"UBC"在两个向量中都位于第6位,那么您应该使用此命令:

matching <- sapply(neighbors, function(l) any(l == mtop))

但是,这会产生警告,因为neighbors[[1]]超过mtop

如果您想要两个数据结构共有的名称,可以使用以下代码:

intersect(unlist(neighbors), mtop)

如果你需要别的东西,你必须在你的问题中更具体,即给出输出应该是什么样子的明确例子,并涵盖可能导致结构上不同输出的所有可能的输入配置。

答案 1 :(得分:0)

怎么样:

l<- lapply(neighbours,function(x)x[x %in% mtop])

这将返回列表,其中每个列表元素将具有向量mtop中的元素。

现在只选择那些长度非零的元素:

names(l)[sapply(l,length)>0]

您可以将这些组合成一行:

names(neighbours)[sapply(neighbours,function(x)Reduce("|",mtop %in% x))]