R 将所有MYSQL表加载到具有相同名称的数据帧中
我已经使用以下代码成功地将所有MySQL表加载到尽可能多的dataframe变量中,所有这些变量的名称都与表名相同(这是个人学习)。我的问题是:有没有更好的方法,因为我感觉这相当慢R 将所有MYSQL表加载到具有相同名称的数据帧中,r,rmysql,R,Rmysql,我已经使用以下代码成功地将所有MySQL表加载到尽可能多的dataframe变量中,所有这些变量的名称都与表名相同(这是个人学习)。我的问题是:有没有更好的方法,因为我感觉这相当慢 db<-dbConnect(MySQL(),user='****',password="****",dbname="****",host='XX.XXX.XXX.XX') tables<-dbListTables(db) #load all tables in variables with
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)
如图所示,考虑将所有MySQL表保存为<强> > <强>列表中的许多数据框,避免了在全局环境中管理许多对象。下面偶数将列表元素命名为相应的表名,可使用
$
或[[…]]]
索引进行引用:
# DATA FRAME LIST OF NAMED ELEMENTS
dfList <- setNames(lapply(tables, function(t) dbReadTable(db, t)), tables)
dfList$table1Name
dfList[["table2Name"]]
...
现在,如果您确实需要多个变量,请使用list2env
将列表元素输出到单独的对象:
list2env(dfList, envir=.GlobalEnv)
如图所示,考虑将所有MySQL表保存为<强> > <强>列表中的许多数据框,避免了在全局环境中管理许多对象。下面偶数将列表元素命名为相应的表名,可使用
$
或[[…]]]
索引进行引用:
# DATA FRAME LIST OF NAMED ELEMENTS
dfList <- setNames(lapply(tables, function(t) dbReadTable(db, t)), tables)
dfList$table1Name
dfList[["table2Name"]]
...
现在,如果您确实需要多个变量,请使用list2env
将列表元素输出到单独的对象:
list2env(dfList, envir=.GlobalEnv)
这里速度方面的限制因素不是R代码,而是您与db的连接和表的大小。但是,更好的方法是将所有数据帧放在一个命名列表中(在表名上使用
lappy
),如果您只是在学习R,请忘记您听说过的assign
;不要使用它。dfList@Parfait:这将把表存储在一个数组(list)中。但是我需要它们的变量名与数据库中的表相同。@joran:如果我不使用assign,那么在名称嵌入到数组表中的变量中存储内容的替代方法是什么?命名列表在功能上与您描述的相同,实际上更好。在全局名称空间中有许多单独的变量,这使得它们都很难使用。这里速度方面的限制因素不是R代码,而是您与数据库的连接和表的大小。但是,更好的方法是将所有数据帧放在一个命名列表中(在表名上使用lappy
),如果您只是在学习R,请忘记您听说过的assign
;不要使用它。dfList@Parfait:这将把表存储在一个数组(list)中。但是我需要它们的变量名与数据库中的表相同。@joran:如果我不使用assign,那么在名称嵌入到数组表中的变量中存储内容的替代方法是什么?命名列表在功能上与您描述的相同,实际上更好。全局名称空间中有很多单独的变量,这使得它们都很难使用。+1对于命名列表创建思想@Parfait,但我有一个小问题:在列表样式中,mem的利用率(通过对象大小衡量)几乎是原来的两倍。我只量了一张桌子object.size(dfList$table1)
是object.size(table1)
的两倍,其中table1是一个转换后的数据帧,包含来自源数据dfList$table1的一个额外列。因此,尽管增加了一个额外的变量,我们还是减少了50%。为什么?我做了一些调查,发现当转换为POSIXlt表单date时,缩小大小的不是列表而是日期字符字符串。这是有道理的。那么,这回答了你的问题吗?此外,您正在尝试将所有MySQL数据库(存储在服务器硬盘上)存储在R内存环境中。考虑如果资源有限,一次一个地在桌子上工作。是的,这个问题回答得很好。是的,我同意内存需求会随着数据库的增加而增加,然后一次一个表会更好。现在我总共有不到60 MB(object_大小)用于所有60个表。所以这是可以管理的。+1对于命名的列表创建idea@Parfait,但我有一个小问题:在列表样式中,mem的利用率(通过对象大小衡量)几乎是两倍。我只量了一张桌子object.size(dfList$table1)
是object.size(table1)
的两倍,其中table1是一个转换后的数据帧,包含来自源数据dfList$table1的一个额外列。因此,尽管增加了一个额外的变量,我们还是减少了50%。为什么?我做了一些调查,发现当转换为POSIXlt表单date时,缩小大小的不是列表而是日期字符字符串。这是有道理的。那么,这回答了你的问题吗?此外,您正在尝试将所有MySQL数据库(存储在服务器硬盘上)存储在R内存环境中。考虑如果资源有限,一次一个地在桌子上工作。是的,这个问题回答得很好。是的,我同意内存需求会随着数据库的增加而增加,然后一次一个表会更好。现在我总共有不到60 MB(object_大小)用于所有60个表。所以这是可以管理的。