通过R中的循环为数据帧分配名称

时间:2011-09-21 21:11:53

标签: r for-loop variable-assignment

似乎有一些类似的问题,但我不能在这么晚的时候完全理解它们

我正在尝试基于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似乎没有帮助

3 个答案:

答案 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)