使用dplyr进行分组统计

时间:2016-06-09 02:38:00

标签: r dplyr

我有一个看起来有点像这样的数据集 -

Col1 Col2 Col3 Col4 Col5
400  322  345  1    1
131  345  809  1    1 
565  676  311  2    1
121  645  777  2    1
322  534  263  3    1
545  222  111  3    1

我想执行分组计算,其中对于Col5中的每个唯一值,我计算Col1的Col8:Col3分组的统计信息 -

(X(i,j)-X'(i,j))/S(i)

其中X(i,j)表示组i的变量的平均值,j(Col5,Col4),X'表示同一变量的其他组j的平均值,S是整个组i的标准偏差。例如,在上述情况下,基于Col4中的组1的Col1的统计量将为 -

(mean(400,131)-mean(565,121,322,545))/stddev(Col1)
(265.5-388.25)/193.85 = -0.633

我想使用ddply的汇总函数为每个变量以及Col4和Col5中的每个组计算此值。

PS-我希望我能够清楚地解释这个问题。

谢谢!

2 个答案:

答案 0 :(得分:1)

按照Col4'分组后的一个选项和' Col5'将获得整列的sum,即Col1' ,从Col1'元素的sum中减去它。在每个组中,除以整个数据集的行数与组的行数(n())之差,以获得不在组中的mean个元素。从组的mean中获取差异,然后除以整列的标准偏差。

 library(dplyr)
 df1 %>% 
    group_by(Col4, Col5) %>% 
    summarise(ColN = (mean(Col1)-((sum(df1$Col1) - 
                   sum(Col1)))/(nrow(df1)-n()))/sd(df1$Col1) )

如果我们需要Col1:Col3,请使用summarise_each

 df1 %>% 
    group_by(Col4, Col5) %>%
    summarise_each(funs(((mean(.) - ((sum(df1$.)-sum(.))/(nrow(df1)- 
                      n())))/sd(df1$.))), Col1:Col3)
#  Col4  Col5       Col1       Col2       Col3
# <int> <int>      <dbl>      <dbl>      <dbl>
#1     1     1 -0.6332145 -0.9922312  0.7342422
#2     2     1 -0.0335307  1.6279003  0.5623983
#3     3     1  0.6667452 -0.6356690 -1.2966405

答案 1 :(得分:1)

只是为了好玩,这里的答案相当于@ akrun,但没有使用dplyr

a <- matrix(ncol=3, nrow=3)   
n <- 1
for(i in unique(df$Col5)){
 for(ii in unique(df$Col4[df$Col5 == i])){
  a[n,1] <- i
  a[n,2] <- ii
  a[n,3] <- (mean(df$Col1[df$Col4 == ii]) - mean(df$Col1[!df$Col4 == ii])) / sd(df$Col1)
  n      <- n + 1
 }
}

> a
     [,1] [,2]       [,3]
[1,]    1    1 -0.6332145
[2,]    1    2 -0.0335307
[3,]    1    3  0.6667452

这是Col1。您可以使用复制和粘贴为Col2和Col3添加相同的内容。