子集大于匹配

时间:2014-06-17 09:30:57

标签: r subset

我希望对我执行此操作的数据框进行子集化:

test = genes_names %in% annot2$Short_Name_Sc
summary(test)  # 3140 rows to subset
## Mode       FALSE    TRUE    NA's 
## logical    2146    3140       0 

test2 = annot2[test, 1]
nrow(annot2)
## [1] 5371
nrow(test2)
## [1] 3195 # There are 55 rows unexpected

令我惊讶的是test2对象在TRUE向量中的行数多于test。我认为可能会出现[]

我尝试了子集:

probe = subset(annot2, test, 1)

但它的行数与前一代码相同。有什么解释吗?

数据非常大,所以我没有发布,不幸的是我没有设法制作一个可重复的例子。 数据集都是字符:

summary(annot2)
## Probe_ID         Short_Name_Sc      Systematic_Name_Sc
## Length:5371        Length:5371        Length:5371       
## Class :character   Class :character   Class :character  
## Mode  :character   Mode  :character   Mode  :character

summary(genes_names)
## Length     Class      Mode 
## 5286       character  character 

1 个答案:

答案 0 :(得分:1)

由于genes_namesannot2[, 1]的长度不同导致向量test被部分回收,因此会出现此行为。向量testgenes_names的长度为5286,但nrow(annot2)等于5371.因此,在调用annot2[test, 1]时,结果实际为annot2[c(test, test[1:85]), 1](数字85来自差异长度; 85 = 5371 - 5286)。

使用mtcars的可重现的示例,其具有32行:如果我们将test定义为长度不等于32的某个逻辑向量,例如test <- c(T, T, F, F, T),然后mtcars[test, 1]mtcars[c(rep(test, 6), test[1:2]), 1]相同,长度为20.向量test会尽可能多地回收,以适应32行mtcars(即6次),返回18行(因为TRUE中有3 test个值)加上来自test的前两个元素的2个额外行(因为32 = 2 mod 5)。