2017-05-22 44 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

相关问题