2016-12-14 64 views
0

我想轉換的版本R /微軟-R我PROC SQL/SAS代碼一個SQL/SAS等效代碼

這裏是我的示例代碼

proc sql; 
create table GENDER_YEAR as 
select YEAR,GENDER,count(distinct CARD_NO) as CM_COUNT,sum(SPEND) as TOTAL_SPEND, sum(case when SPEND GT 0 then 1 else 0 end) as NO_OF_TRANS 
from ABC group by YEAR,GENDER; 
quit; 

我在啓嘗試下面的編碼R

library("RevoPemaR") 
byGroupPemaObj <- PemaByGroup() 

GENDER_cv_grouped <- pemaCompute(pemaObj = byGroupPemaObj, data = Merchant_Trans,groupByVar = "GENDER",computeVars = c("LOCAL_SPEND"),fnList = list(sum = list(FUN = sum, x = NULL))) 

它一次只能對事計算,但我需要CARD_NO的重複計數,耗費的總和,沒有找到花盡可能跨爲YEAR &的每一段沒有零排Gende河

輸出應該像下面

YEAR GENDER CM_COUNT TOTAL_SPEND NO_OF_TRANS 
YEAR1 M  23  120  119 
YEAR1 F  21  110  110 
YEAR2 M  20  121  121 
YEAR2 F  35  111  109 

期待幫助這一點。

+0

歡迎來到Stack Overflow!請閱讀關於[如何提出一個好問題](http://stackoverflow.com/help/how-to-ask)以及如何給出[可重現的示例]的信息(http://stackoverflow.com/questions/ 5963269)。這會讓其他人更容易幫助你。 – zx8754

+0

你有沒有試過包https://github.com/RevolutionAnalytics/dplyrXdf?它與dplyr具有完全相同的語法,但適用於XDF文件。另外,爲什麼不把這兩列連接成1列,用逗號分隔和分組呢? – AbdealiJK

回答

0

最簡單的方法是將它串聯到一個列中並使用它。似乎大多數dplyrXdf和RevoPemaR都不支持具有2個變量的組。

要做到這一點的方法是在頂部添加一個rxDataStep,它首先創建該變量,然後按它進行分組。這有些近似的代碼是:

library("RevoPemaR") 
byGroupPemaObj <- PemaByGroup() 

rxDataStep(inData = Merchant_Trans, outFile = Merchant_Trans_Groups, 
      transform = list(year_gender = paste(YEAR, GENDER,)) 

GENDER_cv_grouped <- pemaCompute(pemaObj = byGroupPemaObj, 
    data = Merchant_Trans_Groups, groupByVar = "GENDER", 
    computeVars = c("LOCAL_SPEND"), 
    fnList = list(sum = list(FUN = sum, x = NULL))) 

注意整體有在做一個REVR作爲GROUPBY據我所知的3種方法。每個人都有優點和缺點。

  1. rxSplit - 這實際上爲您想要的每個組創建不同的XDF文件。這可以與splitByFactor arg一起使用,其中因子指定應創建哪些組。

  2. RevoPemaR的PemaByGroup - 這假設每個組的數據都可以存儲在RAM中。這是一個公平的假設。它還需要原始的Xdf文件按GroupBy列排序。它只支持1列分組。

  3. dplyrXdf's group_by - 這是流行的dplyr軟件包的一個變種。它有許多可變的操作方法 - 所以使用dplyr類似的語法來編寫rxSplit和rxDataStep是一種不同的方式。它也只支持1列進行分組。

所有這三種方法當前只支持單個變量組操作。因此,他們都需要對數據進行一些預處理。

+0

實際上,dplyrXdf應該可以很好地處理多個分組變量(如果沒有,請提交一個錯誤報告)。這裏真正的問題是'count distinct'不是本機支持的xdf文件操作,並且需要[解決方法。](http://stackoverflow.com/questions/36328996/count-distinct-in-a-rxsummary) –

0

下面是使用dplyrXdf的簡單解決方案。與數據框不同,dplyr提供的n_distinct()彙總函數不能與xdf文件一起使用,所以這會執行兩步驟彙總:首先包括card_no作爲分組變量,然後計算card_no的數量。

首先,生成一些示例數據:

library(dplyrXdf)  # also loads dplyr 
set.seed(12345) 

df <- expand.grid(year=2000:2005, gender=c("F", "M")) %>% 
    group_by(year, gender) %>% 
    do(data.frame(card_no=sample(20, size=10, replace=TRUE), 
        spend=rbinom(10, 1, 0.5) * runif(10) * 100)) 

xdf <- rxDataStep(df, "ndistinct.xdf", overwrite=TRUE) 

現在叫summarise兩次,取的事實,即第一summarise將分組變量的列表中刪除card_no

smry <- xdf %>% 
    mutate(trans=spend > 0) %>% 
    group_by(year, gender, card_no) %>% 
    summarise(n=n(), total_spend=sum(spend), no_of_trans=sum(trans)) %>% 
    summarise(cm_count=n(), total_spend=sum(total_spend), no_of_trans=sum(no_of_trans)) 

as.data.frame(smry)  

    #year gender cm_count total_spend no_of_trans 
#1 2000  F  10 359.30313   6 
#2 2001  F  8 225.89571   3 
#3 2002  F  7 332.58365   6 
#4 2003  F  5 333.72169   5 
#5 2004  F  7 280.90448   5 
#6 2005  F  9 254.37680   5 
#7 2000  M  8 309.77727   6 
#8 2001  M  8 143.70835   2 
#9 2002  M  8 269.64968   5 
#10 2003  M  8 265.27049   4 
#11 2004  M  9 99.73945   3 
#12 2005  M  8 178.12686   6 

驗證這與通過在原始數據幀上運行dplyr鏈可以得到相同的結果(模行排序):

df %>% 
    group_by(year, gender) %>% 
    summarise(cm_count=n_distinct(card_no), total_spend=sum(spend), no_of_trans=sum(spend > 0)) %>% 
    arrange(gender, year) 

    #year gender cm_count total_spend no_of_trans 
    #<int> <fctr> <int>  <dbl>  <int> 
#1 2000  F  10 359.30313   6 
#2 2001  F  8 225.89571   3 
#3 2002  F  7 332.58365   6 
#4 2003  F  5 333.72169   5 
#5 2004  F  7 280.90448   5 
#6 2005  F  9 254.37680   5 
#7 2000  M  8 309.77727   6 
#8 2001  M  8 143.70835   2 
#9 2002  M  8 269.64968   5 
#10 2003  M  8 265.27049   4 
#11 2004  M  9 99.73945   3 
#12 2005  M  8 178.12686   6