理解`Reduce`功能

时间:2015-02-16 16:13:01

标签: r reduce

我对R中的Reduce函数有疑问。我读了它的文档,但我仍然感到困惑。所以,我有5个基因名称的载体。例如:

v1 <- c("geneA","geneB",""...)
v2 <- c("geneA","geneC",""...)
v3 <- c("geneD","geneE",""...)
v4 <- c("geneA","geneE",""...)
v5 <- c("geneB","geneC",""...)

我想知道哪些基因存在于至少两个载体中。有人建议:

Reduce(intersect,list(a,b,c,d,e))

如果有人能够向我解释这个陈述是如何工作的,我将不胜感激,因为我已经看到Reduce在其他场景中使用过。

2 个答案:

答案 0 :(得分:33)

Reduce接受二元函数和数据项列表,并以递归方式将函数连续应用于列表元素。例如:

Reduce(intersect,list(a,b,c))

相同
intersect((intersect(a,b),c)

但是,我不认为这个构造对你有帮助,因为它只会返回所有向量中常见的那些元素。

要计算基因出现的载体数量,您可以执行以下操作:

vlist <- list(v1,v2,v3,v4,v5)
addmargins(table(gene=unlist(vlist), vec=rep(paste0("v",1:5),times=sapply(vlist,length))),2,list(Count=function(x) sum(x[x>0])))
       vec
gene    v1 v2 v3 v4 v5 Count
  geneA  1  1  0  1  0     3
  geneB  1  0  0  0  1     2
  geneC  0  1  0  0  1     2
  geneD  0  0  1  0  0     1
  geneE  0  0  1  1  0     2

答案 1 :(得分:7)

假设在这个答案结尾给出了输入值,表达式

Reduce(intersect,list(a,b,c,d,e))
## character(0)

给出所有载体中存在的基因,而不是至少存在于两个载体中的基因。这意味着:

intersect(intersect(intersect(intersect(a, b), c), d), e)
## character(0)

如果我们想要至少两个载体中的基因:

L <- list(a, b, c, d, e)
u <- unlist(lapply(L, unique)) # or:  Reduce(c, lapply(L, unique))

tab <- table(u)
names(tab[tab > 1])
## [1] "geneA" "geneB" "geneC" "geneE"

sort(unique(u[duplicated(u)]))
## [1] "geneA" "geneB" "geneC" "geneE"

注意:我们使用了:

a <- c("geneA","geneB")
b <- c("geneA","geneC")
c <- c("geneD","geneE")
d <- c("geneA","geneE")
e <- c("geneB","geneC")