似乎有一些类似的问题,但我不能在这么晚的时候完全理解它们
我正在尝试基于sql调用操作一组数据帧 - 类似这样的
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=""));
}
所以我在数据帧df1,df2,df3之后,我可以将它们组合起来等。
Andrie在下面的回答是完美的,但我无法将其扩展为两个变量
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 :(得分: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.frame:
myData[[1]]
EDIT。关键是lapply
将单个向量作为输入。您的指令c(t, x)
将其输入组合到一个向量中。因此,您不应该更改myQuery
- 它仍然只需要一个输入参数。
答案 1 :(得分:1)
嗯,assign
函数需要名称和值作为参数:
assign(nam, sqlQuery(channel,paste("Select myCol from myTable where myVal =",x[i],sep="")))
输入?assign
了解详情...
答案 2 :(得分: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)