2017-01-23 2 views
1

Je fais face à des données sensibles, donc je suis préoccupé par l'utilisation de RPostgreSQL. J'ai toutes les données nécessaires chargées dans les données dans R. J'essaie d'exécuter des requêtes sur les données en utilisant la fonction sqldf() dans R. Ces requêtes ont été écrites pour Oracle SQL Developer il y a des années, donc nous essayons d'éviter de réécrire les scripts entièrement. Pouvoir réutiliser les scripts SQL pré-écrits nous permettra d'économiser énormément de temps. Le script semble se déclencher lorsque nous atteignons la fonction SQL over(). Je suis conscient que base sqldf ne supporte pas la fonction over(). J'ai lu que la fonction over() fonctionne avec le paquetage RPostgreSQL, mais est-ce que cela nécessite que je envoie mes données vers une base de données externe? D'après ma compréhension de RpostgreSQL, vous devez vous connecter à PostgreSQL et créer une nouvelle base de données. Nous ne pouvons pas envoyer ces données à un système de stockage de données externe. Existe-t-il un autre moyen d'utiliser la fonction over() tout en conservant les données locales sur mon PC?OVER() fonction dans R en utilisant sqldf sans 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; 

Répondre

2

Vous avez raison que le paquet RPostgreSQL est utilisé pour se connecter à une base de données externe, un peu différent de sqldf qui est utilisé pour exécuter SQL sur des trames de données R. sqldf repose sur d'autres packages pour gérer les connexions de base de données.

Vous avez tort que "sqldf ne prend pas en charge la fonction over". Le pilote par défaut sqldf, sqlite, est une variante SQL qui n'a pas over(). Cependant, vous pouvez utiliser sqldf avec une installation locale de PostgreSQL (sqldf peut utiliser RPostgreSQL en coulisses). Voir la FAQ de sqldf How does one use sqldf with PostgreSQL?, que je posterai la plupart de ci-dessous. Vous remarquerez que la requête SQL utilise over().

1. Installation PostgreSQL, 2. RPostgreSQL package R 3. sqldf lui-même. RPostgreSQL et sqldf sont des installations de paquet R ordinaires.

Assurez-vous d'avoir créé une base de données vide, par ex. "test". Le programme createdb fourni avec PostgreSQL peut être utilisé pour cela. par exemple. à partir de la console/shell créer une base de données appelée test comme ceci:

createdb --help 
createdb --username=postgres test 

Voici un exemple en utilisant RPostgreSQL et après que nous montrons un exemple d'utilisation RpgSQL. La déclaration d'options ci-dessous peut être saisie directement ou alternativement peut être mis dans votre .Rprofile. Les valeurs indiquées ici sont en fait les paramètres par défaut:

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

Je ne suis pas autorisé à télécharger et installer le logiciel sur cette machine sans longue haleine processus d'approbation. Je ne pense pas que je serai en mesure de télécharger une version locale de PostgreSQL. Existe-t-il un autre moyen de forcer RPostgreSQL à charger à partir de la mémoire R? – MakoEyedSoldier

+2

'RPostgreSQL' est simplement un moyen de connecter R à une installation de postgreSQL. C'est juste la connexion. Si vous n'avez pas d'installation locale de PostgreSQL, vous n'avez rien à vous connecter. – Gregor