我有一个看起来有点像这样的数据集 -
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-我希望我能够清楚地解释这个问题。
谢谢!
答案 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添加相同的内容。