假设我的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
任何想法??
答案 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))]