2016-02-09 79 views
1

我對R非常陌生,在讀取文件時遇到錯誤。R解析tsv,下標越界錯誤

importSilvaNgsDataFile <- function(file){ 
    sampleNames <- unlist(strsplit(readLines(file,n=1),split="\t")) 
    otuTable <- read.csv(file, header=FALSE, sep="\t",quote="",dec=".", skip=1,row.names=length(sampleNames)+1) 
    inputData <- list(sampleNames=sampleNames, otuTable=otuTable) 
    return(inputData) 
} 

mydata <- importSilvaNgsDataFile('silva_otus.tsv') 

這給出了錯誤:

Error in data[[rlabp]]: subscript out of bounds 

silva_otus.tsv樣子:

31_F6_57.8 32_F7_55.4 36_F1_57.1 37_F2_57.2 41_E6_55.1 42_E7_56.6 43_E8_57.3 44_E9_58.3 46_D1_55 47_D2_56.7 48_D3_57.2 49_D4_58 51_D6_53.6 52_D7_55 53_D8_56.7 56_E1_52.4 57_E2_55.2 58_E3_56.6 
ID0000002M 408 355 293 805 256 292 614 345 505 455 353 53 231 203 417 581 249 342 
ID0000003M 120 207 43 142 71 60 266 825 89 87 194 1807 91 68 261 151 33 69 
ID0000007M 13 16 12 37 9 9 25 62 7 13 15 120 9 6 38 16 10 12 

我無法看到rlabp來了,我從來沒有在指數試圖進入任何與[rlabp]。我試圖尋找rlabp並沒有看到任何明顯的聯繫。功能有問題嗎?

+1

看起來像這是一個問題e預期的行數,你確定strsplit操作中的那個row.names數是你所追求的嗎? – Shape

+0

你的row.names是一個數字「20」,但它應該是一個長度等於行號的向量。即使你說'1:length(sampleNames)+ 1',當你只有3行時,它就是20個項目的向量。請查看你想用'row.names'實現的目標 – Ananta

回答

1

我覺得你的問題是在這裏(我不是的R程序員,所以不是很確定):

sampleNames <- unlist(strsplit(readLines(file,n=1),split="\t")) 

這會給出一個列表與空場達陣(有之前的一個tab第一個值)

row.names=length(sampleNames)+1 

在這裏,您將1添加到該列表的長度中,可能認爲標題中有一個項目較少,但情況並非如此。

tsv數據本身是有效的。

更新

好吧,的確在R A快速測試,上面似乎是問題。

爲了解決subscript out of bounds刪除+1

row.names=length(sampleNames) 

但這使用最後一列的值作爲行名稱..:

$sampleNames 
[1] ""   "31_F6_57.8" "32_F7_55.4" "36_F1_57.1" "37_F2_57.2" "41_E6_55.1" 
[7] "42_E7_56.6" "43_E8_57.3" "44_E9_58.3" "46_D1_55" "47_D2_56.7" "48_D3_57.2" 
[13] "49_D4_58" "51_D6_53.6" "52_D7_55" "53_D8_56.7" "56_E1_52.4" "57_E2_55.2" 
[19] "58_E3_56.6" 

$otuTable 
      V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 
342 ID0000002M 408 355 293 805 256 292 614 345 505 455 353 53 231 203 417 581 249 
69 ID0000003M 120 207 43 142 71 60 266 825 89 87 194 1807 91 68 261 151 33 
12 ID0000007M 13 16 12 37 9 9 25 62 7 13 15 120 9 6 38 16 10 

你可能要使用的第一列(row.names=1):

otuTable <- read.csv(file, header=FALSE, sep="\t",quote="",dec=".", skip=1, row.names=1) 

$sampleNames 
[1] ""   "31_F6_57.8" "32_F7_55.4" "36_F1_57.1" "37_F2_57.2" "41_E6_55.1" 
[7] "42_E7_56.6" "43_E8_57.3" "44_E9_58.3" "46_D1_55" "47_D2_56.7" "48_D3_57.2" 
[13] "49_D4_58" "51_D6_53.6" "52_D7_55" "53_D8_56.7" "56_E1_52.4" "57_E2_55.2" 
[19] "58_E3_56.6" 

$otuTable 
      V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 
ID0000002M 408 355 293 805 256 292 614 345 505 455 353 53 231 203 417 581 249 342 
ID0000003M 120 207 43 142 71 60 266 825 89 87 194 1807 91 68 261 151 33 69 
ID0000007M 13 16 12 37 9 9 25 62 7 13 15 120 9 6 38 16 10 12 
+0

我很欣賞徹底的迴應,那就是問題所在。謝謝。 – elsherbini