【问题标题】:Different behaviour of intersect on vectors and factors向量和因子上相交的不同行为
【发布时间】:2012-01-25 11:23:02
【问题描述】:

我尝试使用 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)))))

结果不一样。我知道 factor!=originalVector 但我不明白为什么结果会不同,尽管初始因子/向量的长度和级别是相同的。

有人可以解释 intersect 函数对向量和因子的不同行为吗?是不是两个因子列表的交集又是因子列表,然后重复处理不同?

编辑 - 示例:

> 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

我不得不深表歉意。 intersect 函数的不同行为可能是由数据问题引起的。我在数据集中找到了包含逗号分隔的 Entrez ID(22038、23207、...)的字段。我应该先更详细地查看数据。感谢您的回答和您的时间。尽管我还不了解不同的结果,但我确信这是导致不同行为的原因。有人可以确认吗?

【问题讨论】:

  • 不能为别人说话,但一个可重复的例子会很有帮助。
  • 感谢您的评论:我要比较的列表的示例:
  • ID 是因子还是整数变量?如果您从数据库中导入它,并且该数据库将 ID 存储为字符(这是合理的,因为它不是对数值运算有意义的变量),那么它将作为因子导入。
  • 在数据库中,Entrez ID 存储为 varchar,但在 R 中,所有 ID 都被识别为整数:> typeof(l1$entrez) [1] "integer"

标签: r


【解决方案1】:

正如 Roman 所说,举个例子会很有帮助。

然而,一种可能性是您的变量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 自己处理因素(尽管公平地说,还有其他场景你确实想介入)。

【讨论】:

  • 非常感谢洪!您的回答无助于让我摆脱所有困惑,但无论如何都有很大帮助。为了增加另一层混乱,我可以给出第三种计算相交的方法,它给出另一个结果集(第三个结果),而不使用 factor() 或 c():length(Reduce(intersect,list(l1$entrez,l2$entrez) ,l3$entrez,l4$entrez )) 。我在你建议不要使用 c() 之后尝试了这个(这当然是完全正确的)。我使用 c() 是因为我找到了一个使用 Reduced() 的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 2020-05-14
  • 2020-02-24
相关资源
最近更新 更多