r读取多个.dat文件

r读取多个.dat文件,r,file,sqldf,R,File,Sqldf,嗨,我是新来的,是R的初学者 我的问题是: 如果在R中有多个文件(test1.dat、test2.dat,…)要处理,我将使用此代码来读取它们 filelist <- list.files(pattern = "*.dat") df_list <- lapply(filelist, function(x) read.table(x, header = FALSE, sep = "," ,c

嗨,我是新来的,是R的初学者

我的问题是: 如果在R中有多个文件(test1.dat、test2.dat,…)要处理,我将使用此代码来读取它们

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

df_list <- lapply(filelist, function(x) read.table(x, header = FALSE, sep = ","
                                               ,colClasses = "factor", comment.char = "", 
                                               col.names = "raw"))
filelist这似乎有效(但我认为有一种更快的
sql
方法)

阅读:数据表

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

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

#  user  system elapsed 
# 5.244   0.200   5.457 
不知怎么的,lappy()对我不起作用

map_df()在组合7000+个.dat文件时对我有效。还跳过了每个文件的第一行并筛选列“V1”


rawDATfile.list无法帮助使用sql,但您是否尝试了
data.table
package中的
fread
——提供了一些速度gains@user20650我会看一看,但现在我想你误解了我(所以我的问题不清楚)。这更像是一个如何编写正确的
lappy
函数的问题……你的问题很好——我的评论太简短了。我刚刚提供了一种替代方法,允许您使用fist
lappy
方法,但使用
fread
而不是
read.table
。它也可能比sqldf更快。请看mnel对这篇文章的回答。我已经用我的数据做了一些测试,
fread
速度非常快,所以我还要感谢你用
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)))
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))
filelist <- list.files(pattern = "*.dat")

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

#  user  system elapsed 
# 5.244   0.200   5.457 
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)
rawDATfile.list <- list.files(pattern="*.DAT")

data <- rawDATfile.list%>%
  map_dfr(~read.delim(.x, header = FALSE, sep=";", skip=1, quote = "\"'")%>%
            mutate_all(as.character))%>%
  filter(V1=="B")