-2

假设我有我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

有任何想法吗??

4

2 回答 2

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)

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

于 2012-10-15T13:04:25.570 回答
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))]
于 2012-10-15T11:22:01.267 回答