2014-04-24 74 views
4

您好我是新來的,在R A初學者,的R多個.dat文件,文件中讀取

我的問題: 在我有一個以上的文件(test1.dat,test2.dat的情況下,.. )與R中我使用此代碼在

filelist <- list.files(pattern = "*.dat") 

df_list <- lapply(filelist, function(x) read.table(x, header = FALSE, sep = "," 
               ,colClasses = "factor", comment.char = "", 
               col.names = "raw")) 

現在讀他們的工作,我有我的數據是很大的問題,我發現了一個解決方案使用sqldf封裝加快速度:

sql <- file("test2.dat") 
df <- sqldf("select * from sql", dbname = tempfile(), 
        file.format = list(header = FALSE, row.names = FALSE, colClasses = "factor", 
             comment.char = "", col.names ="raw")) 

它適用於o ne文件,但我無法更改代碼以讀入第一個代碼段中的多個文件。有人能幫我嗎?謝謝!莫莫

+0

不能與SQL幫助,但你嘗試''中data.table fread' '包 - 提供一些速度增益 – user20650

+0

@ user20650我會看看它,但現在我想你誤解了我,(所以我的問題不清楚)。這是一個問題,如何寫一個正確的'lapply'功能... – MOMO

+0

你的問題是好的 - 我的評論太簡短了。我只是提供了一個替代方案,可以讓你使用第一個lapply方法,但是使用fread而不是read.table。它也可能比sqldf更快。請參閱mnel對本文的回答http://stackoverflow.com/questions/1727772/quickly-reading-very-large-tables-as-dataframes-in-r/1820610#1820610。 – user20650

回答

1

這似乎是工作(但我相信有一個更快的sql去這)

sql.l <- lapply(filelist , file) 

df_list2 <- lapply(sql.l, function(i) sqldf("select * from i" , 
    dbname = tempfile(), file.format = list(header = TRUE, row.names = FALSE))) 


看速度 - 從MNEL的部分採取張貼Quickly reading very large tables as dataframes in R

library(data.table) 
library(sqldf) 

# test data 
n=1e6 
DT = data.table(a=sample(1:1000,n,replace=TRUE), 
       b=sample(1:1000,n,replace=TRUE), 
       c=rnorm(n), 
       d=sample(c("foo","bar","baz","qux","quux"),n,replace=TRUE), 
       e=rnorm(n), 
       f=sample(1:1000,n,replace=TRUE)) 

# write 5 files out 
lapply(1:5, function(i) write.table(DT,paste0("test", i, ".dat"), 
           sep=",",row.names=FALSE,quote=FALSE)) 

閱讀:data.table

filelist <- list.files(pattern = "*.dat") 

system.time(df_list <- lapply(filelist, fread)) 

# user system elapsed 
# 5.244 0.200 5.457 

讀:sqldf

sql.l <- lapply(filelist , file) 

system.time(df_list2 <- lapply(sql.l, function(i) sqldf("select * from i" , 
    dbname = tempfile(), file.format = list(header = TRUE, row.names = FALSE)))) 

# user system elapsed 
# 35.594 1.432 37.357 

檢查 - 似乎除了屬性

確定
all.equal(df_list , df_list2) 
+0

我已經用我的數據做了一些測試,'fread'真的很快,所以我還要感謝你用'sql'第二種方式# – MOMO

+0

@MOMO;不客氣 – user20650