【问题标题】:SQL/SAS equivalent code in Microsoft-rMicrosoft-r 中的 SQL/SAS 等效代码
【发布时间】:2016-12-14 07:35:44
【问题描述】:

我想在 Rev R/Microsoft-r 中转换我的 Proc 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;

我正在 Rev 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 计数,SPEND 的总和,以及 YEAR 和 Gender 的每个部分的 Transpend 的零行数。

输出应该如下所示

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

期待这方面的帮助。

【问题讨论】:

标签: r microsoft-r


【解决方案1】:

最简单的方法是将列连接成一列并使用它。似乎大多数 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 参数一起使用,其中因子指定应创建哪些组。

  2. RevoPemaR 的 PemaByGroup - 这假设每个组的数据都可以存储在 RAM 中。这是一个公平的假设。它还需要按 GroupBy 列对原始 Xdf 文件进行排序。而且它只支持按1列分组。

  3. dplyrXdf 的 group_by - 这是流行的 dplyr 包的一个旋转。它有许多变量操作方法——因此使用类似 dplyr 的语法编写 rxSplit 和 rxDataStep 的不同方式。它也只支持 1 列进行分组。

目前这三种方法都只支持单变量分组操作。因此,它们都需要对数据进行一些预处理。

【讨论】:

  • 实际上,dplyrXdf 应该可以很好地处理多个分组变量(如果不能,请提交错误报告)。这里真正的问题是 count distinct 不是 xdf 文件本机支持的操作,需要 workaround.
【解决方案2】:

这是一个使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 2021-10-23
    • 2021-11-04
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多