2015-09-11 57 views
0

我試過編寫下面的代碼來確定數字的內部範圍,即:SNP [i,1]應該小於工作[j,1]並且大於工作[j,2 ]被添加到新的數據框。解析R中的數據時出錯

SNP文件是350行,並且工作6500.出於某種原因,我最終以10000s的數據行不符合我的條件。

顯而易見,我在這裏有什麼問題嗎?

for (i in 1:nrow(SNP_file)){ 
    for (j in 1:nrow(Working)){ 

if ((as.numeric(SNP_file[i,1]) >= as.numeric(Working[j,1])) && (as.numeric(SNP_file[i,1]) <= as.numeric(Working[j,2]))){ 
    New <- rbind(New, data.frame(Chromosome =Working[j, 1], 
            Start= Working[j, 2], 
            Stop = Working[j, 3], 
            GO = Working[j,4], 
            Position = VCF[i,1], 
            REF = SNP_file[i,2], 
            GT = SNP_file[i,3], 
            Site_Conf = SNP_file[i,4] 
            )) 
}}} 

感謝,

Ĵ

回答

2

由於比較矢量,則可以避免for循環:

indx <- SNP_file[,1] >= Working[,1] & SNP_file[,1] <= Working[,2] 
[1] TRUE TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE 

此輸出滿足該條件的行的邏輯矢量。這非常有用,因爲現在您可以將該矢量用作子集的索引。

newdf <- cbind(SNP_file[indx,2], Working[indx,2:3]) 

在這種情況下我分配的SNP第二列和Working到一個新的數據幀中的第二列和第三列。只有滿足條件的行。


這只是一個清晰的例子。您的例子是不可複製的,但試試這個來代替:

Working <- Working[1:nrow(SNP_file),] 
indx <- as.numeric(SNP_file[,1]) >= as.numeric(Working[,1]) & as.numeric(SNP_file[,1]) <= as.numeric(Working[,2]) 
New <- data.frame(Chromosome =Working[indx, 1], 
        Start  = Working[indx, 2], 
        Stop  = Working[indx, 3], 
        GO  = Working[indx, 4], 
        Position = VCF[indx, 1], 
        REF  = SNP_file[indx,2], 
        GT  = SNP_file[indx,3], 
        Site_Conf = SNP_file[indx,4] 
            ) 

注意,兩個數據幀的長度是不相等的。 Working的前350行與SNP_file進行比較。如果您以不同的方式進行比較,您應該指定。

數據

set.seed(7) 
SNP_file <- data.frame(x=sample(10), y=month.abb[1:10]) 
Working <- data.frame(x=sample(10), y=sample(20,10), z=(sample(LETTERS[1:10]))) 
+0

作爲OP筆記,有350線在*工作*文件* SNP *文件和6500。您的代碼解決了索引相同的行的問題。但是不清楚應該用另一個6150行* Working *文件來完成。我錯過了什麼嗎? (在我看來,OP想要使用另一個文件的信息來過濾一個文件,儘管它沒有明確說明。) – Daniel

+0

@Daniel是的,他們應該澄清這一點。目前,將Working的子集設置爲前350行將進行一對一的比較。 –

0

它不是從你原來的職位清楚你想要達到的目標。指數ij如何相互對應?你能舉出數據的例子(輸入和期望的輸出)嗎?

在你的代碼迴路重複6500 * 350 = 2275000倍,並在SNP_file工作它比較行。