2011-09-21 35 views
2

似乎有一些类似的问题,但时至今日通过循环分配名称到一个数据帧中的R

我试图操纵基于SQL调用一组dataframes的我不能完全得到我的头一轮他们 - 这样的事情

x <- c(3,9,12) # x is of variable length in real world 

for (i in 1:length(x)) { 
nam <- paste("df",i, sep="") 
assign(nam) <- sqlQuery(channel,paste(
"Select myCol from myTable where myVal =",x[i],sep="")); 
} 

所以我以后dataframes DF1,DF2,DF3,我可以再结合等

下面Andrie的回答是完美的,但我有它延伸到两个变量

麻烦10
myQuery <- function(t,x){ 
    sqlQuery(channel,paste("Select myCol from myTable where myTextVal='",t,"' and myVal =", x, sep="")) 
} 

x <- c(3,9,12) 
t <-c("00","10","12") 
myData <- lapply(c(t,x), myQuery) 

我得到一个“在粘贴错误...参数‘X’为丢失,没有默认值”

我不知道这是否是因为有数字和字符变量的混合在lapply矢量 但在SQL语句中应用as.numeric /as.character似乎并没有帮助

+0

我知道它的晚小时,所以可能就像你在微睡中感觉到的那样,你在写作之前意外地按了ENTER键e实际问题.... :-) – TMS

+0

这个问题最有可能与'assign(nam)< - '可能不符合OP想要的事实有关。我认为你需要把这一切都放在'assign'调用中。 – joran

回答

2

R习语将使用apply类型函数而不是循环。这样做的效果是您的结果数据对象是list。在这种情况下,它将是一个data.frame对象的列表。

类似以下内容:

myQuery <- function(x){ 
    sqlQuery(channel,paste("Select myCol from myTable where myVal =", x, sep="")) 
} 

x <- c(3,9,12) 
t <- c("00","10","12") 

myData <- lapply(c(t, x), myQuery) 

然后,您可以提取与列表子集个人data.frames:

myData[[1]] 

编辑。重点是lapply将采用单个向量作为输入。您的指令c(t, x)将其输入组合到单个矢量中。因此,您不应该更改myQuery - 它仍然只需要一个输入参数。

+0

谢谢你的工作正常。我有一个问题将其扩展到我的现实世界的情况,我有2个变量,其中一个是字符 – pssguy

+0

@pssguy那么,祝你好运。既然你没有提供有关这个问题的信息,似乎我没有太多的工作可以帮忙。 – Andrie

+0

抱歉,在完成之前按下输入按钮我将编辑原始问题 – pssguy

1

好了,assign功能需要的名称和值作为参数:

assign(nam, sqlQuery(channel,paste("Select myCol from myTable where myVal =",x[i],sep=""))) 

类型?assign了解更多...

1

您需要mapply

myData <- mapply(myQuery, t, x, SIMPLIFY=FALSE) 

但我认为更好的办法是先准备查询:

queries <- sprintf(
    "Select myCol from myTable where myTextVal='%s' and myVal=%i", 
    t, x) # here I assume that x is integer, see ?sprintf for other formats 
queries 
[1] "Select myCol from myTable where myTextVal='00' and myVal=3" 
[2] "Select myCol from myTable where myTextVal='10' and myVal=9" 
[3] "Select myCol from myTable where myTextVal='12' and myVal=12" 

然后lapply过他们:

myData <- lapply(queries, function(sql) sqlQuery(channel, sql)) 
# could be simplified to: 
myData <- lapply(queries, sqlQuery, channel=channel) 
+0

谢谢马里克+1。该mapply解决方案工作正常。我也会考虑你的选择。你为什么认为这样更好? – pssguy

+0

@pssguy查询可以在发送到服务器之前进行验证。分离两项任务:准备查询并获取数据,如果全部在同一时间完成,则整体失败的机会增加。它还使您的代码更具可读性。 – Marek

相关问题