2016-12-14 111 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