2015-10-09 4 views
0

Я использую пакет RODBC для загрузки данных из базы данных в R и проведения анализа на основе ежемесячных данных.Как загрузить данные из базы данных в R в разные месяцы

Поскольку данные довольно огромные, и я не могу просто загрузить все данные вместе, поэтому я собираюсь загрузить данные по месяцам и использовать цикл для анализа, ниже приведена логика:

table <- sqlQuery(channel, 
       " select * from db where date between 'yyyy-mm-dd' and 'yyyy-mm-dd' ##this period is 1 month## 
       " 
       , believeNRows=FALSE) 

####run function on table##### 
####then load next month data and run function again##### 

Мой вопрос заключается в том, что, как использовать цикл для загрузки в следующем месяце данные и заменить предыдущий месяц таблицу, также как изменить число год, когда месяц число до 12.

Благодарим вас за помогите и получите хороший.

ответ

3

Это может быть одним из способов сделать это:

dates <- seq(as.Date("2010-01-01"), by = "month", length.out = 13) 
for (i in 1:(length(dates) -1)) { 
    sqlQuery(channel, sprintf("select * from db where date between %s and %s;\n", dates[i],dates[i+1]), believeNRows=FALSE) 
} 

Примечание нескольких вещей: Во-первыхов, последовательность дат должна была бы быть отредактирована в соответствии с вашими потребностями, второй; запросы идут до второго до последнего элемента дат (в противном случае вы получили бы NA (так идите на месяц в будущем) и в-третьих, это не будет печатать запросы, которые вы отправляете, если вы хотите сделать это, измените (или добавить), следующая команда:

cat(sprintf("select * from db where date between %s and %s;\n", dates[i],dates[i+1])) 

В этом случае, этот выходной сигнал (с sqlQuery коммутации для cat дает следующее (обратите внимание на упрощенной петлю только для SQL заявления, а не полный sqlQuery вызова):

dates <- seq(as.Date("2010-01-01"), by = "month", length.out = 13) 
for (i in 1:(length(dates) -1)) { 
    cat(sprintf("select * from db where date between %s and %s;\n", dates[i],dates[i+1])) 
} 
#select * from db where date between 2010-01-01 and 2010-02-01; 
#select * from db where date between 2010-02-01 and 2010-03-01; 
#select * from db where date between 2010-03-01 and 2010-04-01; 
#select * from db where date between 2010-04-01 and 2010-05-01; 
#select * from db where date between 2010-05-01 and 2010-06-01; 
#select * from db where date between 2010-06-01 and 2010-07-01; 
#select * from db where date between 2010-07-01 and 2010-08-01; 
#select * from db where date between 2010-08-01 and 2010-09-01; 
#select * from db where date between 2010-09-01 and 2010-10-01; 
#select * from db where date between 2010-10-01 and 2010-11-01; 
#select * from db where date between 2010-11-01 and 2010-12-01; 
#select * from db where date between 2010-12-01 and 2011-01-01; 
+0

Большое спасибо! Я думаю, что это сработает. Но я не понимаю, что такое c at используется для, пожалуйста, дайте мне знать, спасибо –

+1

'cat' сокращен для конкатенации и печати (см.'? cat'), я добавил его на всякий случай, если вы хотели видеть запросы, которые вы отправляли для целей отладки (или что-то как это). Это не является строго необходимым, здесь важна петля и 'sprintf'. Без 'cat' вы не сможете видеть запросы, которые вы отправляете (что может быть желательно) – erasmortg