2015-07-01 43 views
0

我試圖運行一個循環通過一系列保存爲.csv文件鄰接表的遍歷,將它們轉換爲邊列表中R作爲一個網絡對象和網絡對象,並使用文件名保存每個對象。節省每次迭代的結果的for循環使用的文件名

問題是a)代碼似乎循環遍歷文件名列表,但不會產生任何輸出b)它不會使用文件名保存網絡對象(它每次都會覆蓋)。

注意,代碼工作正常,在更換了字母「f」的for循環的「filename.csv」標識的單個文件。

l.files <- list.files(patt='.*csv$') 
    i <- 0 
    for (f in l.files) { 

     lines=scan(f,what="character",sep="\n") 
     lines=gsub(","," ",lines) 
     lines=gsub("[ ]+$","",gsub("[ ]+"," ",lines)) 
     adjlist=strsplit(lines," ") 
     col1=unlist(lapply(adjlist,function(x) rep(x[1],length(x)-1))) 
     col2=unlist(lapply(adjlist,"[",-1)) 
     el=cbind(col1,col2) 
     #If second column of el contains 0 then delete 
     row_sub = apply(el, 1, function(row) all(row !=0)) 
     #This subset then saved as the new edgelist 
     el <- el[row_sub,] 
     #Save edgelist using the filename 
     el[f] <- el 
     summary(el) 
     i=i+1 
    } 

任何幫助將非常感謝!

+0

你永遠不會得到'i'涉及你想要的方式。我想你想要的是'for(我in 1:length(l.files))'。如果是這樣的話,你不需要'i < - 0'和'i < - i + 1'這兩行,並且必須用'el [i] < - el'中的i替換f。但是,如果沒有示例數據,我無法測試,但也許它會讓你開始 – vaettchen

+0

謝謝,實際上忽略了我沒有使用的索引,所以它的錯誤留下了。 –

+0

我想更簡單的例子是:對於(F在l.files){打開文件,使用的文件名保存文件作爲邊緣列表即文件1 < - EL},使得每個文件現在具有與對應的保存中的R的邊緣列表文件名 –

回答

0

要打開的文件,你可以使用system,例如:

l.files <- system('ls *.csv', intern=T) 
file.objs <- lapply(l.files, read.table) 

那麼你應該能夠很容易地轉換成項目在file.objs到edgelists。

+0

好點,但不是真正的答案...... - 誠然,這是一個從來沒有問清楚的問題! – vaettchen

+0

我明白了,謝謝。對不起,它不是很清楚,我想我有很多問題。我在最後使用apply命令來保存對象,因爲循環使用索引值運行。 –

+0

所以你想在一個循環中打開每個文件,將該對象轉換爲邊界列表,然後將邊緣列表保存到文件中?我認爲在這種情況下,最好的辦法是讓每個鄰接列表文件命名爲'graph1_alist.csv'。然後你可以拆分字符串,並用類似'write.csv(elist,file = paste0(basename,'_elist.csv')''的方式保存邊界列表。在本例中'basename == graph1_'的位置。 –