2015-08-08 7 views
5

Próbuję konwertować kod SQL na kod R. Jednak dane to około 35 milionów rekordów z 200 kolumnami. Najlepszym wyborem, jaki mogłem znaleźć, był pakiet data.table.Konwersja kodu SQL przy użyciu "case when ..." przy użyciu pakietu data.table w R

Oto problem. W kodzie SQL jestem w stanie wykonać operację, takich jak ten,

select order_date,sum(case when item in ("D","C","B") then col4 end)as col1 
sum(case when item not in ("Z","X","Y") then col4 end) as col2 
from datatable 
where col3 <25 
group by order_date; 

Co powyższe zapytanie pozwala mi grupy przez każdy dzień. Nie mogę go skopiować w data.table. Moje próby są następujące.

grp1<- c("D","C","B") 
grp2<- c("Z","X","Y") 
d1 <- dat[item %in% grp1,.(col1 = sum(col4,na.rm = TRUE),by = Order_Date] 
d2 <- dat[item %in% grp2,.(col2 = sum(col4,na.rm = TRUE),by = Order_Date] 
d3 <- data.table(d1,d2) 

Teraz, ponieważ subsets początkowo moja grupa jest inna zarówno d1 i d2

+0

Wiem, że to nie jest twoje pytanie, ale czy wiesz, że istnieją pakiety R, które są w stanie uruchomić kod SQL (dplyr i inne)? – maj

+0

Nie rozumiem, kiedy mówisz, nie moje pytanie? Chcę to wszystko zaimplementować przy użyciu pakietu data.table. – Shoaibkhanz

+0

Jestem ciekawy w kwestii czasu SQL i R rozwiązań na twoich danych (35Mx200), czy mógłbyś to sprawdzić i opublikować? – jangorecki

Odpowiedz

6

Można spróbować wykonać następujące czynności:

DT[col3 < 25, 
    .(col1 = sum(col4[item %in% c("D","C","B")]), 
    col2 = sum(col4[!item %in% c("Z","X","Y")])), 
    by = .(order_date)] 
0
>  d <- " 
+  order_date,item,col4,col3 
+  2000-01-01,D,1,10 
+  2000-01-01,C,1,10 
+  2000-01-01,M,1,10 
+  2000-01-01,N,1,50 
+  2000-01-01,Z,1,10 
+  2000-01-01,X,1,10 
+  2001-01-02,Z,1,0 
+  2001-01-02,X,1,50" 
> 
>  df = read.csv(textConnection(d)) 
> 
>  # data.frame + plyr approach 
> 
>  require(plyr) 
Loading required package: plyr 
>  ddply(
+  df[df$col3<25,], 
+  .(order_date), 
+  summarize, 
+  col1=sum(item %in% c("D","C","B") & col4), 
+  col2=sum(!item %in% c("Z","X","Y") & col4) 
+ ) 
     order_date col1 col2 
1  2000-01-01 2 3 
2  2001-01-02 0 0 
> 
>  # data.table approach, thanks to jangorecki 
> 
>  require(data.table) 
Loading required package: data.table 
>  dt = data.table(df) 
> 
>  dt[col3 < 25, 
+  .(col1 = sum(col4[item %in% c("D","C","B")]), 
+   col2 = sum(col4[!item %in% c("Z","X","Y")])), 
+  by = .(order_date)] 
     order_date col1 col2 
1:  2000-01-01 2 3 
2:  2001-01-02 0 0 
>