2014-06-17 120 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