2

几年后,我刚刚回到 R 的领域,并且遇到了通过 sqlSave 循环传递变量的问题。我已经在 Win7 机器上启动了 RODBC 并使用 MySQL 顺利运行,但似乎无法让我的循环工作。这是我拥有的数据以及我想要完成的工作:

  • 使用 pitchRX 库的 2012 年 MLB 逐场比赛数据保存为单个“值”,称为“mlb12”,具有多个表
  • “mlb12”里面有七张桌子(atbat、pitch、game、player、runner、umpire、coach)
  • 我想创建一个循环,该循环将为 R 中的每个表创建一个数据框,这样我就可以使用 sqlSave 将它们通过一个循环将它们插入到我的 MySQL 数据库中
  • 我已经将所有这些表插入到我的 MySQL 数据库中,但是我以“长”方式进行了操作(即声明每个 DF 并为每个插入创建一个 sqlSave 语句),并且希望在两个循环中执行它们以清理代码.
  • 下面是我目前必须抓取这些数据并将其插入 MySQL 数据库的代码:

library(RODBC)

library(pitchRx)   

mlb12 <- scrapeFX(start = "2012-04-05", end = "2012-04-07",     
         tables=list(atbat=fields$atbat,pitch=fields$pitch,
         game=fields$game,player=fields$player,
         runner=fields$runner,umpire=fields$umpire,
         coach=fields$coach))

atbat <- mlb12$atbat
pitch <- mlb12$pitch
game <- mlb12$game
player <- mlb12$player
runner <- mlb12$runner
umpire<- mlb12$umpire
coach <- mlb12$coach

channel <- odbcConnect("db", uid = "cs", pwd = "pw")
sqlSave(channel,mlb12$atbat,tablename="atbat")
sqlSave(channel,mlb12$pitch,tablename="pitch")
sqlSave(channel,mlb12$game,tablename="game")
sqlSave(channel,mlb12$player,tablename="player")
sqlSave(channel,mlb12$runner,tablename="runner")
sqlSave(channel,mlb12$umpire,tablename="umpire")
sqlSave(channel,mlb12$coach,tablename="coach")
close(channel)  

我尝试编写的用于设置数据帧和简化 sqlSave 语句的循环都未能正确执行。这是我尝试过的一个示例,我认为它会起作用:

i<-0
while (i<6) {
i<-i+1
a<-c("atbat","pitch","game","player","runner","umpire","coach")
b<-paste("mlb12$",a,sep="")
c[[i]]<-paste("test",i,sep="")
  }

这个循环的问题是我不记得如何(或想出如何)使用 c[[i]] 增量字段来获取“b”值来为列表中的每个表创建数据框。我相当确定如果我能解决这个问题,我可以让一个循环为“sqlSave”部分工作。有没有办法用自动增量字段(或基于第二个列表的字段)做我想做的事情?

4

1 回答 1

2

例如,您可以lapply像这样使用:

channel <- odbcConnect("db", uid = "cs", pwd = "pw")
a<-c("atbat","pitch","game","player","runner","umpire","coach")
lapply(a,function(x) 
     sqlSave(channel,mlb12[[x]],tablename=x)
close(channel)  
于 2013-04-09T23:06:51.540 回答