R:获取矩阵嵌套列表每列的中值绝对偏差(MAD)

问题描述 投票:0回答:3

我正在尝试获取列 MAD 我的嵌套列表并返回具有相同结构的嵌套列表。我的列表示例如下,来自此页面

k = 5
library(mvtnorm)
set.seed(123)
listofdfs <- list()
a=0
variance=1
g1=5
g2=5
mn=0
covar=matrix(c(variance,a,a,a,variance,a,a,a,variance),ncol=3)

for (i in 1:k){  
  x1 = rmvnorm(n=g1,mean=c(mn,mn,0),sigma=covar)
  x2 = rmvnorm(n=g2,mean=c(mn,mn,0),sigma=covar) 
  data = list(x1=x1,x2=x2) # to make each sub element to x1 and x2
  df = data
  listofdfs[[i]]=df    
}
listofdfs

#rename the datasets
listofdfs <- setNames(listofdfs, paste0('df', 1:5))

head(listofdfs) 

$df1
$df1$x1
             [,1]       [,2]       [,3]
 [1,] -0.56047565 -0.2301775  1.5587083
 [2,]  0.07050839  0.1292877  1.7150650
 [3,]  0.46091621 -1.2650612 -0.6868529
 [4,] -0.44566197  1.2240818  0.3598138
 [5,]  0.40077145  0.1106827 -0.5558411
 [6,]  1.78691314  0.4978505 -1.9666172
 [7,]  0.70135590 -0.4727914 -1.0678237
 [8,] -0.21797491 -1.0260044 -0.7288912
 [9,] -0.62503927 -1.6866933  0.8377870
[10,]  0.15337312 -1.1381369  1.2538149

$df1$x2
             [,1]        [,2]       [,3]
 [1,]  0.42646422 -0.29507148  0.8951257
 [2,]  0.87813349  0.82158108  0.6886403
 [3,]  0.55391765 -0.06191171 -0.3059627
 [4,] -0.38047100 -0.69470698 -0.2079173
 [5,] -1.26539635  2.16895597  1.2079620
 [6,] -1.12310858 -0.40288484 -0.4666554
 [7,]  0.77996512 -0.08336907  0.2533185
 [8,] -0.02854676 -0.04287046  1.3686023
 [9,] -0.22577099  1.51647060 -1.5487528
[10,]  0.58461375  0.12385424  0.2159416

我想找到 k=5 时 x1 和 x2 中每一列的 MAD 值。我正在使用此函数并获取 x1 第 1 列从

$df1
$df5
的 MAD 值:

lapply(listofdfs, function(y) mad(y$x1[,1]))

$df1
[1] 0.6720464

$df2
[1] 0.6111537

$df3
[1] 0.5019855

$df4
[1] 0.7117195

$df5
[1] 0.6085593

我必须使用此函数来获取 x1 和 x2 中其余列的 MAD 值。如何在一个函数中获取 MAD 的值(对于 x1 和 x2 而言,列 =3 中的 k=5)?

r apply lapply
3个回答
1
投票

首先,您必须将矩阵转换为数据框,然后

rapply()
unlist = "list"
似乎可以满足您的要求:

k = 5
library(mvtnorm)
set.seed(123)
listofdfs <- list()
a=0
variance=1
g1=5
g2=5
mn=0
covar=matrix(c(variance,a,a,a,variance,a,a,a,variance),ncol=3)

for (i in 1:k){  
  x1 = as.data.frame(rmvnorm(n=g1,mean=c(mn,mn,0),sigma=covar))
  x2 = as.data.frame(rmvnorm(n=g2,mean=c(mn,mn,0),sigma=covar) )
  data = list(x1=x1,x2=x2) # to make each sub element to x1 and x2
  df = data
  listofdfs[[i]]=df    
}

#rename the datasets
listofdfs <- setNames(listofdfs, paste0('df', 1:5))
rapply(listofdfs, mad, how = "list")
#> $df1
#> $df1$x1
#> $df1$x1$V1
#> [1] 0.5788186
#> 
#> $df1$x1$V2
#> [1] 0.5053593
#> 
#> $df1$x1$V3
#> [1] 1.551788
#> 
#> 
#> $df1$x2
#> $df1$x2$V1
#> [1] 0.8124393
#> 
#> $df1$x2$V2
#> [1] 0.8201937
#> 
#> $df1$x2$V3
#> [1] 1.835052
#> 
#> 
#> 
#> $df2
#> $df2$x1
#> $df2$x1$V1
#> [1] 0.6696449
#> 
#> $df2$x1$V2
#> [1] 0.9381823
#> 
#> $df2$x1$V3
#> [1] 0.7699464
#> 
#> 
#> $df2$x2
#> $df2$x2$V1
#> [1] 0.9090718
#> 
#> $df2$x2$V2
#> [1] 0.247186
#> 
#> $df2$x2$V3
#> [1] 1.012018
#> 
#> 
#> 
#> $df3
#> $df3$x1
#> $df3$x1$V1
#> [1] 0.8265921
#> 
#> $df3$x1$V2
#> [1] 0.3067163
#> 
#> $df3$x1$V3
#> [1] 0.9440248
#> 
#> 
#> $df3$x2
#> $df3$x2$V1
#> [1] 0.3024162
#> 
#> $df3$x2$V2
#> [1] 0.1273361
#> 
#> $df3$x2$V3
#> [1] 0.7478695
#> 
#> 
#> 
#> $df4
#> $df4$x1
#> $df4$x1$V1
#> [1] 1.156026
#> 
#> $df4$x1$V2
#> [1] 1.32832
#> 
#> $df4$x1$V3
#> [1] 0.703393
#> 
#> 
#> $df4$x2
#> $df4$x2$V1
#> [1] 0.8368312
#> 
#> $df4$x2$V2
#> [1] 1.234974
#> 
#> $df4$x2$V3
#> [1] 0.7706332
#> 
#> 
#> 
#> $df5
#> $df5$x1
#> $df5$x1$V1
#> [1] 0.1668533
#> 
#> $df5$x1$V2
#> [1] 1.520311
#> 
#> $df5$x1$V3
#> [1] 0.4594677
#> 
#> 
#> $df5$x2
#> $df5$x2$V1
#> [1] 1.408639
#> 
#> $df5$x2$V2
#> [1] 0.1901449
#> 
#> $df5$x2$V3
#> [1] 0.3374949

创建于 2023-09-06,使用 reprex v2.0.2


1
投票

您也可以直接在嵌套矩阵列表上调用

rapply()
,并使用
apply()
计算每个矩阵列的 MAD:

,而不是先将矩阵转换为 data.frames
mads <- rapply(listofdfs, f = \(x) apply(x, 2, mad, simplify = FALSE), how = "list")

str(mads, list.len = 2)
#> List of 5
#>  $ df1:List of 2
#>   ..$ x1:List of 3
#>   .. ..$ : num 0.579
#>   .. ..$ : num 0.505
#>   .. .. [list output truncated]
#>   ..$ x2:List of 3
#>   .. ..$ : num 0.812
#>   .. ..$ : num 0.82
#>   .. .. [list output truncated]
#>  $ df2:List of 2
#>   ..$ x1:List of 3
#>   .. ..$ : num 0.67
#>   .. ..$ : num 0.938
#>   .. .. [list output truncated]
#>   ..$ x2:List of 3
#>   .. ..$ : num 0.909
#>   .. ..$ : num 0.247
#>   .. .. [list output truncated]
#>   [list output truncated]

0
投票

听起来您正在寻找这样的东西:

library(purrr)
map(listofdfs, # for each element in listofdfs
  \(d) map(d, # for each matrix in that element
   \(x) map(ncol(x) |> seq_len(), # for each column
    \(n) stats::mad(x[,n])))) # calculate mad

输出:

[[1]]
[[1]]$x1
[[1]]$x1[[1]]
[1] 0.5788186

[[1]]$x1[[2]]
[1] 0.5053593

[[1]]$x1[[3]]
[1] 1.551788


[[1]]$x2
[[1]]$x2[[1]]
[1] 0.8124393

[[1]]$x2[[2]]
[1] 0.8201937

[[1]]$x2[[3]]
[1] 1.835052



[[2]]
[[2]]$x1
[[2]]$x1[[1]]
[1] 0.6696449

[[2]]$x1[[2]]
[1] 0.9381823

[[2]]$x1[[3]]
[1] 0.7699464


[[2]]$x2
[[2]]$x2[[1]]
[1] 0.9090718

[[2]]$x2[[2]]
[1] 0.247186

[[2]]$x2[[3]]
[1] 1.012018



[[3]]
[[3]]$x1
[[3]]$x1[[1]]
[1] 0.8265921

[[3]]$x1[[2]]
[1] 0.3067163

[[3]]$x1[[3]]
[1] 0.9440248


[[3]]$x2
[[3]]$x2[[1]]
[1] 0.3024162

[[3]]$x2[[2]]
[1] 0.1273361

[[3]]$x2[[3]]
[1] 0.7478695



[[4]]
[[4]]$x1
[[4]]$x1[[1]]
[1] 1.156026

[[4]]$x1[[2]]
[1] 1.32832

[[4]]$x1[[3]]
[1] 0.703393


[[4]]$x2
[[4]]$x2[[1]]
[1] 0.8368312

[[4]]$x2[[2]]
[1] 1.234974

[[4]]$x2[[3]]
[1] 0.7706332



[[5]]
[[5]]$x1
[[5]]$x1[[1]]
[1] 0.1668533

[[5]]$x1[[2]]
[1] 1.520311

[[5]]$x1[[3]]
[1] 0.4594677


[[5]]$x2
[[5]]$x2[[1]]
[1] 1.408639

[[5]]$x2[[2]]
[1] 0.1901449

[[5]]$x2[[3]]
[1] 0.3374949
© www.soinside.com 2019 - 2024. All rights reserved.