2014-06-17 119 views
0

我想一个子集数据帧我这样做更大:子集比比赛

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 S IN 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 
+0

您的示例完全不可重现。另外,你正在使用genes_names,annot2,test和annot2?使其具有可重现性或至少表现出清晰的思路。 –

+0

也许你想'test = annot2 $ Short_Name_Sc%in%genes_names',它将返回一个逻辑向量,指示'Short_Name_Sc'中的哪一个属于'genes_names'。 – jbaums

+0

@konvas'length(genes_names)[1] 5286> nrow(annot2)[1] 5371'你是对的。这意味着'%in%'和'subset'省略了''。当我用'&'命令进行子集化时,我应该这样做。如果你在答复中发帖,我会接受它。谢谢 – Llopis

回答

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行(因为在test中有3个TRUE值)加上来自test的前两个元素的2个附加行(因为32 = 2模5)。

+0

如果你使它更通用,它会帮助更多的人 – Llopis

+1

完成:)谢谢! – konvas