2017-05-22 46 views
0

我已成功將所有MySQL表加載到儘可能多的數據框變量中,所有的表名都與表名(這是個人學習)使用以下代碼相同。我的問題是:有沒有更好的方法,因爲我感覺這很慢。將所有MYSQL表加載到具有相同名稱的數據框中

db<-dbConnect(MySQL(),user='****',password="****",dbname="****",host='XX.XXX.XXX.XX') 

    tables<-dbListTables(db) 

    #load all tables in variables with same name as the MySQL table name. 
    #warning : this loop will take more than 90 seconds to complete and will download all the MySQL tables. 
    for (i in 1:NROW(tables)){ 
    assign(tables[i],dbReadTable(db,tables[i])) 
    } 

#release the DB 
    dbDisconnect(db) 

這是地球上最快的方法嗎?

+1

速度方面的限制因素不是R代碼,而是連接到數據庫和表的大小。然而,更好的方法是將所有數據框放在一個命名列表中(在表名上使用'lapply'),如果你剛剛學習R,忘記了聽過「assign」;不要使用它。 – joran

+0

'dfList < - lapply(tables,function(t)dbReadTable(db,t))' – Parfait

+0

@Parfait:這會將表存儲在一個數組(列表)中。但我需要它們的變量名稱與DB中的表相同。 –

回答

2

如圖所示,考慮將所有MySQL表保存爲一個許多數據框的列表,避免了必須在全局環境中管理多個對象。下面連名字列表中的元素對應的表名可與$[[..]]索引被引用:

# DATA FRAME LIST OF NAMED ELEMENTS 
dfList <- setNames(lapply(tables, function(t) dbReadTable(db, t)), tables) 

dfList$table1Name  
dfList[["table2Name"]]  
... 

因此,你可以通過索引訪問的每個數據幀和運行任何數據幀操作,好像他們是獨立的對象:

現在
aggregate(.~Group1 + Group2, dfList$table1Name, FUN=sum) 

merge(dfList$table1Name, dfList$table2Name, by="joinkey") 

by(dfList$table1Name, dfList$table1Name[c("factor1", "factor2")], FUN=summary) 

,如果你真的,真的想多變量,使用list2env輸出列表中的元素以不同的對象:

list2env(dfList, envir=.GlobalEnv) 
+0

對於指定列表創建想法+1 @Parfait 但我有一個小問題: mem利用率(通過對象大小度量)幾乎是列表樣式的兩倍。我只測量了一張桌子。 'object.size(dfList $ table1)'是 'object.size(table1)'的兩倍,其中table1是一個轉換後的數據幀,其中一個額外的列來自源數據dfList $ table1。所以儘管增加了一個額外的變量,我們減少了50%。爲什麼? –

+0

我做了一些調查,發現它不是列表,但日期字符串,當轉換爲POSIXlt形式日期收縮大小。這就說得通了。 –

+0

那麼,這是否回答你的問題?另外,在這裏你試圖將所有的MySQL數據庫(存儲在服務器硬盤上)存儲在R內存環境中。如果資源有限,請考慮一次在桌面上工作。 – Parfait

相關問題