相互作用和因子的不同行为

时间:2012-01-25 11:23:02

标签: r

我尝试使用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,...)的字段。我应该先对数据进行更详细的研究。谢谢你的答案和时间。虽然我还不了解不同的结果,但我确信这是造成不同行为的原因。有人可以证实吗?

1 个答案:

答案 0 :(得分:0)

正如罗马所说,一个例子会非常有用。

然而,一种可能性是您的变量l1$entrezl2$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自己处理因素(虽然公平地说,还有其他情况你想要介入)。