我尝试使用Reduce(intersect,...)比较Entrez ID(整数向量)的多个向量。使用“DISTINCT”从数据库中选择向量,因此单个向量不包含重复项。
length(factor(c(l1$entrez)))
给出与
相同的长度(以及与长度函数相同的ID)length(c(l1$entrez))
当我用
比较多个向量时length(Reduce(intersect,list(c(l1$entrez),c(l2$entrez),c(l3$entrez),c(l4$entrez))))
或
length(Reduce(intersect,list(c(factor(l1$entrez)),c(factor(l2$entrez)),c(factor(l3$entrez)),c(factor(l4$entrez)))))
结果不一样。我知道这个因素!= originalVector但我无法理解为什么结果不同,尽管初始因子/向量的长度和水平是相同的。
有人可以解释相交函数对向量和因子的不同行为吗?两个因子列表的交叉是否也是因子列表,然后重复处理不同?
编辑 - 示例:
> head(l1)
entrez
1 1
2 503538
3 29974
4 87769
5 2
6 144568
> head(l2)
entrez
1 1743
2 1188
3 8915
4 7412
5 51082
6 5538
列表包含大约500到20K的Entrez ID。因此,向量包含纯整数,并且应该在所有测试的向量之间给出相交。
> length(Reduce(intersect,list(c(factor(l1$entrez)),c(factor(l2$entrez)),c(factor(l3$entrez)),c(factor(l4$entrez)))))
[1] 514
> length(Reduce(intersect,list(c(l1$entrez),c(l2$entrez),c(l3$entrez),c(l4$entrez))))
[1] 338
> length(Reduce(intersect,list(l1$entrez,l2$entrez,l3$entrez,l4$entrez)))
[1] 494
我要大声道歉。交叉函数的不同行为可能是由数据问题引起的。我在数据集中找到了包含逗号分隔的Entrez ID(22038,23207,...)的字段。我应该先对数据进行更详细的研究。谢谢你的答案和时间。虽然我还不了解不同的结果,但我确信这是造成不同行为的原因。有人可以证实吗?
答案 0 :(得分:0)
正如罗马所说,一个例子会非常有用。
然而,一种可能性是您的变量l1$entrez
,l2$entrez
等具有相同的级别,但顺序不同。
intersect
通过as.vector
转换其参数,将因子转换为字符变量。这通常是正确的做法,因为它意味着不同的级别顺序不会对结果产生任何影响。
将factor(l1$entrez)
作为参数传递给intersect
也会消除不同级别顺序的影响,因为它有效地创建了一个新的因子,其中级别排序设置为默认值。但是,如果您传递c(l1$entrez)
,则会从您的变量中删除因子属性,而您剩下的是原始整数代码,这取决于级别排序。
示例:
a <- factor(letters[1:3], levels=letters)
b <- factor(letters[1:3], levels=rev(letters)
# returns 1 2 3
intersect(c(factor(a)), c(factor(b)))
# returns integer(0)
intersect(c(a), c(b))
我认为你没有任何理由在这里使用c()
。让R自己处理因素(虽然公平地说,还有其他情况你想要介入)。