【问题标题】:Obtaining basic statistics on multiple variables and multiple groups获取多个变量和多个组的基本统计数据
【发布时间】:2021-05-17 21:51:54
【问题描述】:

我想为下面两个变量 y1y2 的数据计算 2 个基本统计数据。

首先,对于每个group,我想分别获得variance*n_of_group-1(例如,对于group==1,答案将是y1上的6y2上的2)。

其次,对于每个group,我想分别获得covariance*n_of_group-1(例如,对于group==1,答案将是0)。

我已经尝试了一些东西,但我想知道如何将*n_of_group-1 部分应用到我下面的 R 代码中?

ps. n_of_group 就是每个组的count()n() 我的想要的输出如下所示。

z <- "group    y1    y2
1 1         2     3
2 1         3     4
3 1         5     4
4 1         2     5
5 2         4     8
6 2         5     6
7 2         6     7
8 3         7     6
9 3         8     7
10 3        10     8
11 3         9     5
12 3         7     6"

dat <- read.table(text = z, header = T)

dat %>%
  group_by(group) %>%
  summarise(var1 = var(y1), var2 = var(y2)) # how to apply the `*n_of_group-1` to var1 & var2

dat %>%
  group_by(group) %>%
  summarise(co = cov(y1,y2)) # how to apply the `*n_of_group-1` to co, what if `co` was more than 1 number

期望的输出(如果我们将上面每个组的结果放在一个 2x2 矩阵中):

group1 = matrix(c(6,0,0,2),2)   # The two repetitive element in the middle (0,0) are 
                                # the second statistic, the other elements are the 
                                # first statistics
group2 = matrix(c(2,-1,-1,2),2)
group3 = matrix(c(6.8,2.6,2.6,5.2),2)

【问题讨论】:

  • 你是如何得到那些matrix 输出的

标签: r dataframe dplyr statistics tidyverse


【解决方案1】:

这是你想要的吗?

dat %>%
  group_by(group) %>%
  summarise(var1 = var(y1) * (n()-1), 
            var2 = var(y2) * (n()-1),
            co   = cov(y1, y2) * (n()-1))


# A tibble: 3 x 4
  group  var1  var2    co
* <int> <dbl> <dbl> <dbl>
1     1   6     2     0  
2     2   2     2    -1  
3     3   6.8   5.2   2.6

为每个组输出到单独的矩阵中:

dat %>%
  group_by(group) %>%
  summarise(var1 = var(y1) * (n()-1), 
            var2 = var(y2) * (n()-1),
            co   = cov(y1, y2) * (n()-1),
            co2  = co) %>%
  select(group, var1, co, co2, var2) -> a

split(a, a$group) -> a
lapply(a, function(x) { x["group"] <- NULL; x }) -> a
lapply(a, function(x) { matrix(x, nrow = 2, ncol = 2)})

$`1`
     [,1] [,2]
[1,] 6    0   
[2,] 0    2   

$`2`
     [,1] [,2]
[1,] 2    -1  
[2,] -1   2   

$`3`
     [,1] [,2]
[1,] 6.8  2.6 
[2,] 2.6  5.2 

【讨论】:

  • 已编辑以包含矩阵输出。
【解决方案2】:

我们也可以使用across

library(dplyr)
dat %>% 
    group_by(group) %>%
    summarise(co = cov(y1, y2) * (n() - 1), 
       across(c(y1, y2), ~ var(.) * (n() - 1), 
             .names = 'var_{.col}'), .groups = 'drop')

-输出

# A tibble: 3 x 4
#  group    co var_y1 var_y2
#  <int> <dbl>  <dbl>  <dbl>
#1     1   0      6      2  
#2     2  -1      2      2  
#3     3   2.6    6.8    5.2

另外,最好先创建n

library(tibble)
dat %>% 
   add_count(group) %>%
   group_by(group) %>%
   summarise(co = cov(y1, y2) * (first(n) - 1), 
   across(c(y1, y2), ~ var(.) * (first(n)- 1), 
             .names = 'var_{.col}'), .groups = 'drop')

【讨论】:

  • @rnorouzian 如果你使用.names,变量名会改变,否则,across 的输出会替换那些'y1','y2',第二个cov 会使用它
  • @rnorouzian 你能检查你的packageVersion('dplyr')
  • @rnorouzian 我用过packageVersion('dplyr')# [1] ‘1.0.2’
  • @rnorouzian 正如您在版本中显示的那样,与 1.0.2 相比,您有一个较旧的 1.0.0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 2018-09-02
  • 2021-08-07
  • 2014-09-25
  • 2019-04-10
  • 2019-03-21
  • 2016-03-29
相关资源
最近更新 更多