2013-04-26 139 views
1

您好,我正在合併從NSE Bhavcopy下載的csv。不同的日期有不同的cols。說26-12-2006它有998行& 27-12-2006它有1003行。它有8列。我做cbind創建一個&乙只有2色,符號,收盤價。我使用colnames命名col,以便合併我可以通過SYMBOL進行合併。合併多個csv在R

問題:

1)當我使用與由= 「SYMBOL」 合併功能,所有= F;我很驚訝地看到結果c有1011行。在我讀過的地方,與所有= F合併,它應該變成998行或最大1003行。我還分析了這些數據,發現在26-12-2006中有3種不同的符號在27-12-2006 &中有5個不同的符號。所以當我們通過「SYMBOL」合併時,兩個行中的新符號會被添加?或者它只會與先前存在的行合併?

2)NSEmerg是一個函數,它使用for循環讀取新文件,每次&與現有的c文件合併。我有大約1535個文件,其數據來自2006年12月至2013年4月。但是我無法合併超過12個文件,因爲它引發錯誤向量大小爲12 MB,因此無法允許。它還顯示警告消息,說1535 MB的內存分配用完了。同樣在第12個文件中,我發現c的nrow是1508095,意味着無限循環運行。在所有的1535份文件中,最高排在1435.即使我們加入所有已退市的股票,沒有在特定日期交易,我相信它可能不會跨越2200個股票。爲什麼這顯示150萬的黑暗?

3)有什麼更好的方式合併csv?我第一次在堆棧溢出,我會附加說10個文件。

代碼:

a <- read.csv("C://Users/home/desktop/061226.csv", stringsAsFactors = F, header = T) 
b <- read.csv("C://Users/home/desktop/061227.csv", stringsAsFactors = F, header = T) 
a_date <- a[2,1] 
b_date <- b[2,1] 
a <- cbind(a[,2],a[,6]) 
b <- cbind(b[,2], b[,6]) 
colnames(a) <- c("SYMBOL", a_date) 
colnames(b) <- c("SYMBOL", b_date) 
c <- merge(a,b,by = "SYMBOL", all = F) 

NSEmerg <- function(x,y) { 
    y_date <- y[2,1] 
    y <- cbind(y[,2], y[,6]) 
    colnames(y) <- c("SYMBOL", y_date) 
    c <- merge(c, y, by = "SYMBOL", all = F) 
    } 

filenames = list.files(path = "C:/Users/home/Documents/Rest data", pattern = "*csv") 

for (i in 1:length(filenames)){ 
    y <- read.csv(filenames[i], header = T, stringsAsFactors = F) 
    c <- NSEmerg(c,y) 
    } 

write.csv(c, file = "NSE.csv") 

回答

-1

你可能會更好只使用一個Perl一行代碼:

perl -pe1 file1 file2 file3 ... > newfile 

,然後你可以砍你需要出

cut -f1,2 -d"," newfile > result 
+0

我對PERL沒有任何線索,早些時候當我粘貼引用它拋出錯誤說PERL不可用;你能給我準確的語法嗎?說我有文件130425.csv,130423.csv,130422.csv;如何用3個文件在perl中創建一個新文件?所有這3個文件只在工作目錄中。當我輸入你的代碼時,它給我一個錯誤,說perl -pe1 130425中出現意外的數字常量。對不起,我對編碼非常陌生&R – planetpb 2013-04-26 20:49:29

1

您確定要cbind而不是rbind?回答你最後的問題。首先,你列出所有的.csv文件在你的地圖:

listfiles <- list.files(path="C:/Users/home/desktop", pattern='\\.csv$', full.names=TRUE) 

下一頁使用do.call在不同的CSV文件閱讀和rbind將它們結合起來。

df <- do.call(rbind, lapply(listfiles , read.csv)) 
+2

'pattern'參數是一個正則表達式,所以你應該跳過這段時間,否則它意味着任何角色。如果你想要全面證明,你應該添加一個$來表示字符串結尾,例如'pattern ='\\。csv $''。 – 2013-04-26 21:50:31

+0

謝謝你的改進。我更新了答案。 – JT85 2013-04-27 09:07:19