2017-01-23 2 views
1

Я имею дело с некоторыми конфиденциальными данными, поэтому меня беспокоит использование RPostgreSQL. У меня есть все данные, необходимые для загрузки в dataframes в R. Я пытаюсь выполнить запросы по данным с помощью функции sqldf() в R. Эти запросы были написаны для Oracle SQL Developer несколько лет назад, поэтому мы пытаемся избежать переписывания скриптов полностью. Возможность повторного использования предварительно написанных сценариев SQL сэкономит нам огромное количество времени. Сценарий, кажется, срабатывает, когда мы нажимаем на функцию over() SQL. Я знаю, что base sqldf не поддерживает функцию over(). Я прочитал, что функция over() работает с пакетом RPostgreSQL, но требует ли я, чтобы я отправлял свои фреймы данных во внешнюю базу данных? Из моего понимания RpostgreSQL вам нужно подключиться к PostgreSQL и создать новую базу данных. Мы не можем отправить эти данные во внешнюю систему хранения данных. Есть ли другой способ использовать функцию over(), сохраняя локальные ящики данных на моем ПК?Функция OVER() в R с использованием sqldf без RPostgreSQL?

select program, importance_level, count(distinct subject_id)      

from       
(      
select r.subject_id,       

case       
    when rc_level is not null and rc_level <> 'NA'     
         then 'bad_guy' 
        when (rc_level is null or rc_level = 'NA') and 
     (substr(r.base_category, 2, 2) in ('5R', '8Q', '8P')  
        or r.process_name in ('On The Way'))  
      then 'run_away'      
      when (rc_level is null or rc_level = 'NA') and r.process_name = 
'Fancy Order'      
      then 'repeater'      
      when (rc_level is null or rc_level = 'NA') and 
(a.current_program_code in ('BOP', 'IAS', 'LIS', 'SIS')       
      or method_code in ('SIP', 'POB')       
      or substr(r.base_category, 2, 2) in ('9F', '7G'))      
        then 'NEWBIE' 
      else 'Other'      
     end      
       as importance_level,  

case       
when a.current_program_code in ('123', 'ABC', 'DEF', 'HIJ', 'KLM', 'NOP', 'QRS') then 'YAW'       
when a.current_program_code in ('RE', 'FDS', 'QWE', 'WER', 'ERT','RTY','TYU') then 'PO'      
when a.current_program_code in ('LEP') then 'MOM'      
else a.current_program_code      
end      
as program      

from FY16DATA r left join (select distinct * from (select subject_id, first_value(current_program_code) over (partition by subject_id order by start_date desc) as current_program_code, first_value(process_name) over (partition by subject_id order by start_date desc) as process_name, first_value(method_code) over (partition by subject_id order by start_date desc) as method_code, max(load_fy) over (partition by subject_id) as load_fy from FY16NAME)) a on r.subject_id = a.subject_id       
where r.load_fy = '2016' and r.thing_status <> 'Over' and r.thing_status in ('Head','Hair','Face')      

)      
group by program, importance_level; 

ответ

2

Вы правы, что RPostgreSQL пакета используется для подключения к внешней базе данных, несколько отличных от sqldf, который используется для запуска SQL в кадрах R данных. sqldf полагается на другие пакеты для обработки соединений с базой данных.

Вы ошибаетесь, что "sqldf не поддерживает функцию over". Драйвер sqldf по умолчанию, sqlite, является вариантом SQL, который не имеет over(). Однако вы можете использовать sqldf с локальной установкой postgreSQL (sqldf может использовать RPostgreSQL за кулисами). См. Sqldf FAQ How does one use sqldf with PostgreSQL?, который я опубликую больше всего ниже. Вы заметите, что SQL-запрос использует over().

Установка 1. PostgreSQL 2. RPostgreSQL R пакет 3. sqldf сам. RPostgreSQL и sqldf - обычные пакеты R.

Убедитесь, что вы создали пустую базу данных, например. "test". Для этого может использоваться программа createdb, которая поставляется с PostgreSQL. например из консоли/оболочки создать базу данных с именем теста, как это:

createdb --help 
createdb --username=postgres test 

Вот пример использования RPostgreSQL и после этого мы покажем пример использования RpgSQL. Оператор параметров, показанный ниже, может быть введен прямым или поочередно может быть помещен в ваш .Rprofile. Значения, показанные здесь, на самом деле по умолчанию:

options(sqldf.RPostgreSQL.user = "postgres", 
    sqldf.RPostgreSQL.password = "postgres", 
    sqldf.RPostgreSQL.dbname = "test", 
    sqldf.RPostgreSQL.host = "localhost", 
    sqldf.RPostgreSQL.port = 5432) 

Lines <- "Group_A Group_B Group_C Value 
A1 B1 C1 10 
A1 B1 C2 20 
A1 B1 C3 30 
A1 B2 C1 40 
A1 B2 C2 10 
A1 B2 C3 5 
A1 B2 C4 30 
A2 B1 C1 40 
A2 B1 C2 5 
A2 B1 C3 2 
A2 B2 C1 26 
A2 B2 C2 1 
A2 B3 C1 23 
A2 B3 C2 15 
A2 B3 C3 12 
A3 B3 C4 23 
A3 B3 C5 23" 

DF <- read.table(textConnection(Lines), header = TRUE, as.is = TRUE) 

library(RPostgreSQL) 
library(sqldf) 
# upper case is folded to lower case by default so surround DF with double quotes 
sqldf('select count(*) from "DF" ') 

sqldf('select *, rank() over (partition by "Group_A", "Group_B" order by "Value") 
     from "DF" 
     order by "Group_A", "Group_B", "Group_C" ') 
+0

Я не разрешено загружать и устанавливать программное обеспечение на эту машину без длинный, вытянутый процесс утверждения. Я не думаю, что смогу загрузить локальную версию PostgreSQL. Возможно ли другой способ заставить RPostgreSQL загружаться из R-памяти? – MakoEyedSoldier

+2

'RPostgreSQL' - это просто способ подключения R к установке postgreSQL. Это просто связь. Если у вас нет локальной установки postgreSQL, вам нечего подключать. – Gregor

Смежные вопросы