2013-01-09 140 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