我正在处理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
我非常感谢任何帮助!
答案 0 :(得分:5)
合并lapply
和rbind
应该这样做。对于每个列表元素,您在计算核对表中的子元素数量,然后将结果简单地合并到矩阵中。
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