Присвоение имен фрейму данных через цикл в R - PullRequest
2 голосов
/ 22 сентября 2011

Похоже, что есть некоторые похожие вопросы, но я не могу обойти их в этот поздний час

Я пытаюсь манипулировать набором фреймов данных на основе вызовов 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, которые я могу затем объединить и т. Д.

Ответ Андри ниже идеален, но у меня возникают проблемы с расширением его до двух переменных

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 но применение as.numeric /as.character в выражении sql, похоже, не помогло

Ответы [ 3 ]

2 голосов
/ 22 сентября 2011

Идиома 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)

Затем можно извлечь отдельные фреймы данных с поднабором списка:

myData[[1]]

EDIT. Дело в том, что lapply примет один вектор в качестве входного. Ваша инструкция c(t, x) объединяет свой ввод в один вектор. Таким образом, вы не должны изменять myQuery - он по-прежнему принимает только один входной аргумент.

1 голос
/ 22 сентября 2011

Вам нужно 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)
1 голос
/ 22 сентября 2011

Ну, функция assign нуждается в имени и значении в качестве аргументов:

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

Введите ?assign, чтобы узнать больше ...

...