Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将summary()输出转换为矩阵_R_Dataframe_Matrix_Dplyr_Tidyverse - Fatal编程技术网

将summary()输出转换为矩阵

将summary()输出转换为矩阵,r,dataframe,matrix,dplyr,tidyverse,R,Dataframe,Matrix,Dplyr,Tidyverse,我想知道将我的summary()函数的输出转换为我想要的3个矩阵的最短方法是什么 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

我想知道将我的
summary()
函数的输出转换为我想要的3个矩阵的最短方法是什么

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(cov = cov(y1, y2) * (n() - 1),
            across(c(y1, y2), ~ var(.) * (n() - 1)))

#  group   DV1   DV2   cov
#1     1   6     2     0  
#2     2   2     2    -1  
#3     3   6.8   5.2   2.6

我们可以用一种简单得多的方法来实现这一点。按“组”分组后,在
summary
中创建
列表
列,方法是取
cbind创建的
矩阵
cov
,并对“y1”、“y2”进行运算,然后乘以
n()-1

out <-  dat %>% 
            group_by(group) %>%
            summarise(mat1 = list(cov(cbind(y1, y2)) * (n() - 1)), 
               .groups = 'drop')

或者,这可以通过
group\u split
map

library(purrr)
dat %>%
     group_split(group, .keep = FALSE) %>%
     map(~ cov(.x) * (nrow(.x) - 1))

base R
中,我们可以使用
split

lapply(split(dat[c('y1', 'y2')], dat$group), 
        function(x) cov(x) * (nrow(x) - 1))

如果需要创建三个“组”对象,请使用
list2env

library(stringr)
deframe(out) %>%
     set_names(str_c('group', seq_along(.))) %>% 
     list2env(.GlobalEnv)



group1
#     [,1] [,2]
#[1,]    6    0
#[2,]    0    2
group2
#     [,1] [,2]
#[1,]    2   -1
#[2,]   -1    2

group3
#     [,1] [,2]
#[1,]  6.8  2.6
#[2,]  2.6  5.2

@罗津:有吗error@rnorouzian如果你看一下你文章中的摘要输出,我们只有3列,但在矩阵中,我们希望其中一条对角线被重复。因此,我复制了第1列(除组外)即“co”两次,并在
matrix
@rnorouzian中使用它。我想更新后的更简单的方法会更有用。这很好,我们能不能也
sum()
快速地对这些矩阵求和?是否要对矩阵的元素求和(
purr::map_dbl(out$mat1,sum)
)或者将它们相互添加(
Reduce(“+”,out$mat1)
)?
lapply(split(dat[c('y1', 'y2')], dat$group), 
        function(x) cov(x) * (nrow(x) - 1))
library(stringr)
deframe(out) %>%
     set_names(str_c('group', seq_along(.))) %>% 
     list2env(.GlobalEnv)



group1
#     [,1] [,2]
#[1,]    6    0
#[2,]    0    2
group2
#     [,1] [,2]
#[1,]    2   -1
#[2,]   -1    2

group3
#     [,1] [,2]
#[1,]  6.8  2.6
#[2,]  2.6  5.2