【问题标题】:Group-wise statistic using dplyr使用 dplyr 进行分组统计
【发布时间】:2016-10-09 12:22:48
【问题描述】:

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

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:Col3 按 Col4 分组的统计数据-

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

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

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

我想使用 ddply 的 summarise 函数来计算每个变量以及 Col4 和 Col5 中的每个组的值。

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

谢谢!

【问题讨论】:

  • @akrun 我举了一个计算的例子,对于 Col4 的所有组和变量 Col1:Col3,输出必须是相同的计算。我无法计算输出,我向您展示的唯一方法是手动计算。
  • 我得到(mean(c(400, 131))-mean(c(565,121,322,545)))/sd(df1$Col1) #[1] -0.6332145 sdCol1sd(df1$Col1) #[1] 193.8522
  • @akrun 哦,我是 stack-exchange 的新手,我不知道接受答案部分。谢谢你让我知道,我提出的大部分问题都已得到解答。我会确保从现在开始这样做

标签: r dplyr


【解决方案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

【讨论】:

  • @MridulGarg 根据您显示的计算,它给出了正确的输出,因为我手动显示了我如何获得-0.6332145
  • @MridulGarg 你是如何将stddev(Col1) 设为 176.96,因为sd(Col1)(基于示例)是 193.8522
【解决方案2】:

只是为了好玩,这里的答案等同于@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 添加相同的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-01
    • 2019-01-21
    • 2017-02-14
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    相关资源
    最近更新 更多