2013-01-09 43 views
1

我必须加载许多文件并对其数据进行转换。每个文件只包含一个data.table,但是这些表有不同的名称。将未知变量分配给新变量名称

我想在所有文件上运行一个脚本 - 为此,我必须将未知的data.table分配到一个通用名称......例如blob

什么是R这样做?目前,我最好的猜测(这看起来像是黑客,但有效)是将data.table加载到新环境中,然后:assign('blob', get(objects(envir=newEnv)[1], env=newEnv)

在一个可重复的背景是这样的:

newEnv <- new.env() 
assign('a', 1:10, envir = newEnv) 
assign('blob', get(objects(envir=newEnv)[1], env=newEnv)) 

有没有更好的办法?

回答

2

我假设你使用save()有点像这样保存的data.tables:

d1 <- data.table(value=1:10) 
save(d1, file="data1.rdata") 

,你的问题是,当你加载的文件你不知道的名称(这里:D1),您在保存文件时使用。正确?

我建议你改用saveRDS()readRDS()用于保存/载入单个对象:

d1 <- data.table(value=1:10) 
saveRDS(d1, file="data1.rds") 
blob <- readRDS("data1.rds") 
+0

+1 /接受 - 这正是我想要做的。完美的作品。非常感谢。 – ricardo

5

R方式是创建单个对象,即数据表的单个列表。

下面是一些伪代码,其中包含三个步骤:

  • 使用list.files()一个文件夹中创建的所有文件的列表。
  • 使用lapply()read.csv()来读取您的文件并创建数据帧列表。将read.csv()替换为read.table()或适合您数据的内容。
  • 再次使用lapply(),这次用as.data.table()将数据帧转换为数据表。

的伪代码:

filenames <- list.files("path/to/files") 
dat <- lapply(files, read.csv) 
dat <- lapply(dat, as.data.table) 

你的结果应该是一个列表,称为dat,包含数据表中的每个原始文件的。

+0

为5M +行的文件过大,无法处理间歇,给我的32位/ XP系统。 – ricardo