2014-05-02 60 views
1

我有許多數據幀(從CSV導入)具有相同的結構。我想遍歷所有這些數據框並只保留其中的兩列。R:循環遍歷數據框和子集

下面的循環似乎沒有工作,任何想法爲什麼?最好喜歡用循環來做這個,因爲我試圖更好地使用這些循環。

frames <- ls() 

for (frame in frames){ 
frame <- subset(frame, select = c("Col_A","Col_B")) 
} 

爲任何建議提前歡呼。

+0

1)它是'list',不'ls'; 2)你需要爲幀提供索引,就像'frames [[frame]] < - subset(...)'; 3)「frame in frame」是沒有意義的,因爲你只是用'frames < - list()'創建了一個空列表 - 它應該像'for(frame in 1:5)' – rawr

+0

好,除非你*意圖*列表爲'ls',我不推薦 – rawr

+0

ls()部分工作正常:'frames'包含所有要操作的數據框的列表,但循環給出'argument 「子集」丟失,沒有默認' – Zfunk

回答

1

任何有興趣我以前讀的dataframes作爲一個對象,具有功能補充,表明該文件已經從進口理查德斯克裏芬的想法。這讓我然後使用Plyr包操作數據:

library(plyr) 

dataframes <- list.files(path = TEESMDIR, full.names = TRUE) 

## Define a function to add the filename to the dataframe 

read_csv_filename <- function(filename){ 
    ret <- read.csv(filename) 
    ret$Source <- filename #EDIT 
    ret 
} 

list_dataframes <- ldply(dataframes, read_csv_filename) 

selection <- llply(list_dataframes, subset, select = c(var1,var3)) 
0

基本問題是ls()返回的是你的環境中所有對象名稱的字符向量,而不是對象本身。要使用包含名稱的字符變量來獲取和替換對象,可以使用get()/ assign()函數。你可以重新寫你的功能

frames <- ls() 

for (frame in frames){ 
    assign(frame, subset(get(frame), select = c("Col_A","Col_B"))) 
} 
+0

雖然這樣做直接回答你的問題,但我會不建議使用此策略處理多個數據幀。如果他們是相似的,將他們閱讀到一個共同的名單是一個更好的主意。 – MrFlick

+0

'assign'也可能很危險。 –

+0

謝謝。用R以這種方式處理數據似乎很困難,並且共識是將所有CSV作爲一個對象來讀取。這種方法的問題是在批量操作發生之前需要對數據進行預處理。 – Zfunk