将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