2012-01-04 133 views
1

我想這在R:R列表中的Python列表理解?

fsC=[read.table(x) for x in Sys.glob('./Trial7/*.csv')] 

即試圖讀取每個文件的到矢量屬於的數據結構的單獨的載體的內容。

的Python

[file(x, 'r').read() for x in glob.glob('./Trial7/*.csv')] 

或更好的實際

[file(x, 'r') for x in glob.glob('./Trial7/*.csv')] 

,但我覺得你有一點......

+0

你不需要''./「'在路徑中。 R應該看起來相對於當前的工作目錄。 – 2012-01-04 14:04:20

回答

5

使用sapply到 「地圖」 載體:

sapply(Sys.glob('./Trial7/*.csv'), read.table) -> fsc 
+0

...這種謎題呢? data.frame(Sys.glob('.// Trial7/*。csv'),Sys.glob('./ Trial7/*。csv')) - > y; sapply(y,read.table)',需要一些連接?合併太慢......你怎麼能用更復雜的結構來使用它? Python' [']'是一個殺手鐗... – hhh 2012-01-04 13:54:56

+0

...或者sapply(Sys.glob('.// Trial7/*。csv'),read.table) - > fsc; [fsC]中的x [log(x [2]),你怎麼能在R中做到這一點? – hhh 2012-01-04 13:59:22

+0

由於每種情況下的返回值都是'data.frame',因此不能將輸出簡化爲一個向量,所以'sapply'在這裏返回與'lapply'相同的東西。 – 2012-01-04 14:02:01

7

這裏有兩個問題。首先,「給定一個文件名向量,你如何將這些文件讀入R?」。

這是你的如前面提到的文件名

trial7_files <- Sys.glob("Trial7/*.csv") 
#if you prefer to specify the names using regular expressions, try 
trial7_files <- dir("Trial7", "\\.csv$") 

的名單,lapply是在讀取文件的最好方法。

fsC <- lapply(trial7_files, read.csv) 

這給你一個數據框的列表,並導致你的下一個問題。 「如何將具有相同列的數據幀列表合併到一個數據幀中?」

執行此操作的標準方法是使用do.callrbind。首先,記下每個數據集中有多少行是很有用的。

n_records <- sapply(fsC, nrow) 
fsC <- do.call(rbind, fsC) 

這就是你的問題解決了,雖然你可能想要一個列告訴你哪一個文件每行都來自。

fsC$source <- rep(trial7_files, n_records) 
+0

+1,您可以通過添加行來添加有關數據源的信息:names(trial7_files)< - trial7_files和名稱將填充到data.frame的rownames中。 – 2012-01-04 17:30:34

+0

@WojciechSobala:是的,我從那開始,但那些rownames被編號(而不是每個來源的相同值),我認爲將源作爲一個因素會更有用。 – 2012-01-04 17:35:58

+0

'匹配錯誤。名稱(clab,名稱(xi)): 名稱與以前的名稱不匹配 調用:do.call - > - > rbind - > match.names'在'fsC < - do.call(rbind,fsC )'。 – hhh 2012-01-04 22:58:18