R:计算嵌套列表

时间:2015-05-20 19:01:03

标签: r

我正在处理R中的一些数据,并且有一个向量(例如基因列表),我想知道这个向量的多少成员出现在列表列表的子列表中(例如列表)在不同时间点表达的基因的表达。 我可以通过检查x[] %in% y[[]]is.element(x[], y[[]])来手动执行此操作,但我正在尝试找出如何编写R函数来为我执行此操作,因为我有一些这些向量和长列表。 这是一个玩具示例:

mylist <- list("Hr01" = c("G0295801", "G0295799", "G0293928", "G0293730", "G0293626", "G0293536", "G0293364", "G0291640", "G0291233", "G0290907"), "Hr02" =c ("G0295801", "G0295701", "G0295689", "G0293730", "G0293626", "G0293364", "G0293360", "G0293276", "G0293066", "G0292860", "G0292814", "G0292028", "G0292014", "G0291824"), "Hr03" = c("G0295701", "G0293364", "G0293276", "G0291714", "G0291253", "G0290405", "G0290259", "G0289553", "G0284885"))

checklist <- as.vector(c("G0290907", "G0295701", "G0270472", "G0283625", "G0284885"))

可以将这样的内容作为输出(数据框,包含列:子列表的名称,checklist的子列表中出现mylist的成员数量):

"Hr01" 1
"Hr02" 1
"Hr03" 2

我非常感谢任何帮助!

3 个答案:

答案 0 :(得分:5)

合并lapplyrbind应该这样做。对于每个列表元素,您在计算核对表中的子元素数量,然后将结果简单地合并到矩阵中。

do.call(rbind, lapply(mylist, function(x) sum(x %in% checklist)))

     [,1]
Hr01    1
Hr02    1
Hr03    2

答案 1 :(得分:3)

另一种选择是

 mapply(function(x,y) sum(x %in% y),  mylist, list(checklist))
 #Hr01 Hr02 Hr03 
 #1    1    2 

或者@Frank建议

  sapply(mylist,function(y) sum(checklist %in% y))
  #Hr01 Hr02 Hr03 
  # 1    1    2 

或者

library(tidyr)
library(dplyr)
unnest(mylist, group) %>%
           group_by(group) %>% 
           summarise(count=sum(x %in% checklist))
#   group count
#1  Hr01     1
#2  Hr02     1
#3  Hr03     2

答案 2 :(得分:1)

查看lapply生成的&#34;%in%,然后按sum计算 - 计算逻辑向量:

lapply(mylist, "%in%", checklist)
#--------
$Hr01
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE

$Hr02
 [1] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

$Hr03
[1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
#----------

 sapply( lapply(mylist, "%in%", checklist), sum)
Hr01 Hr02 Hr03 
   1    1    2