SAS proc表示R中的等效项

问题描述

随着我的公司逐渐脱离SAS,我不得不将某人的SAS代码转换为R,并且想知道是否有可与proc手段相提并论的R函数?作为参考,proc手段产生的(或至少我需要它产生的)是观察数,均值,最小,最大和标准偏差。同样重要的是,能够按组完成并进行加权。 R中的summary函数产生此输出,但我认为您不能对其进行加权。我希望使用基数R的答案,但如果该答案不存在,则可以打包。@H_404_1@

示例:@H_404_1@

df
   Temp V1  Weight
1  Hi    1  8 
2  Low   2  3 
3  Hi    3  9 
4  Low   4  9 

我需要按组生成V1的各种加权汇总统计信息(中位数,最小值,最大值,总和,平均值等),如下所示:@H_404_1@

Group Min Max Mean Sum
Hi      1  3  2.06 35
Low     2  4  3.5  42
 

解决方法

通常,基数R中的aggregate可以用作SAS proc means的副本。通常,此方法在单个数字列上运行单个简单函数(需要一个输入)。下面是该方法的公式版本:

aggregate(V1 ~ Temp,df,FUN=mean)

但是aggregate可以扩展为多个列和多个功能:

agg_raw <- aggregate(cbind(V1,Weight) ~ Temp,FUN = function(x) c(count = length(x),min = min(x),p = quantile(x,2,probs = seq(0,1,0.25))[2],median = median(x),mean = mean(x),0.25))[4],sum = sum(x))
                    )

agg_df <- do.call(data.frame,agg_raw)
agg_df
#   Temp V1.count V1.min V1.p.25. V1.median V1.mean V1.p.75. V1.sum Weight.count Weight.min Weight.p.25. Weight.median Weight.mean Weight.p.75. Weight.sum
# 1   Hi        2      1      1.5         2       2      2.5      4            2          8         8.25           8.5         8.5         8.75         17
# 2  Low        2      2      2.5         3       3      3.5      6            2          3         4.50           6.0         6.0         7.50         12

对于加权统计信息,aggregate没有内置功能,因此在聚合之前计算统计信息时需要更多细微差别。 R的ave允许跨组计算:

df$V1_wtmean <- ave(df[c("V1","Weight")],df$Temp,FUN=function(x) weighted.mean(x$V1,x$Weight))[[1]]
df$V1_wtsum <- ave(df[c("V1",FUN=function(x) sum(x$V1 * x$Weight))[[1]]

df
#   Temp V1 Weight V1_wtmean V1_wtsum
# 1   Hi  1      8  2.058824       35
# 2  Low  2      3  3.500000       42
# 3   Hi  3      9  2.058824       35
# 4  Low  4      9  3.500000       42

一旦有了这些列,就可以在minmax上汇总以返回分组需求:

agg_df <- do.call(data.frame,aggregate(cbind(V1,V1_wtmean,V1_wtsum) ~ Temp,FUN=function(x) c(min=min(x),mean=mean(x),max=max(x),sum=sum(x)))
                  )
                          
agg_df <- setNames(agg_df[c("V1.min","V1.max","V1.mean","V1.sum","V1_wtmean.min","V1_wtsum.min")],c("Min","Max","Simple.Mean","Simple.Sum","Wgt.Mean","Wgt.Sum"))
                                
agg_df
            
#   Min Max Simple.Mean Simple.Sum Wgt.Mean Wgt.Sum
# 1   1   3           2          4 2.058824      35
# 2   2   4           3          6 3.500000      42     

Online Demo

另请参阅: