问题描述
随着我的公司逐渐脱离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
一旦有了这些列,就可以在min
和max
上汇总以返回分组需求:
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
另请参阅: