首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在排除NaN的情况下计算矩阵列表的元素均值

如何在排除NaN的情况下计算矩阵列表的元素均值
EN

Stack Overflow用户
提问于 2021-07-13 08:39:27
回答 2查看 38关注 0票数 1

假设我有一个矩阵列表。如何计算另一个矩阵,该矩阵的元素是矩阵列表的按元素表示的平均值,并考虑和排除NaN?假设我们有一个矩阵列表:)

代码语言:javascript
复制
> A
     [,1] [,2] [,3]
[1,]   1    4    7
[2,]   2    5    8
[3,]   3    6    9

> B
     [,1] [,2] [,3]
[1,]   2    5    8
[2,]  NaN  NaN  NaN
[3,]   4    7   10

> C
     [,1] [,2] [,3]
[1,]   3    3    6
[2,]   2    3    7
[3,]  NaN  NaN  NaN

> my.list <- list(A, B, C)

我想要的输出是:

代码语言:javascript
复制
     [,1] [,2] [,3]
[1,]   2    4    7
[2,]   2    4   7.5
[3,]  3.5  6.5  9.5

如您所见,我希望计算列表的元素均值,但不包括列表中矩阵的NaN值。例如,输出的元素1,1是(1 +2+ 3) /3= 2,但是输出的元素3,1是(3 + 4) /2= 3.5,因为我们排除了矩阵B中那个位置的NaN。知道如何计算吗?

EN

回答 2

Stack Overflow用户

发布于 2021-07-13 08:40:47

转换为array,然后使用apply循环遍历并获取mean

代码语言:javascript
复制
 apply(simplify2array(my.list), c(1, 2), FUN = mean, na.rm = TRUE)

-ouptut

代码语言:javascript
复制
      [,1] [,2] [,3]
[1,]  2.0  4.0  7.0
[2,]  2.0  4.0  7.5
[3,]  3.5  6.5  9.5

或者可以循环遍历一个维度并使用rowMeans

代码语言:javascript
复制
apply(simplify2array(my.list), 2, rowMeans, na.rm = TRUE)
     [,1] [,2] [,3]
[1,]  2.0  4.0  7.0
[2,]  2.0  4.0  7.5
[3,]  3.5  6.5  9.5

或者另一种选择是

代码语言:javascript
复制
library(dplyr)
library(purrr)
library(data.table)
 map_dfr(my.list, as.data.frame, .id = 'grp') %>% 
   group_by(grp = rowid(grp)) %>% 
   summarise(across(everything(), mean, na.rm = TRUE), 
       .groups = 'drop') %>%
   select(-grp)
# A tibble: 3 x 3
     V1    V2    V3
  <dbl> <dbl> <dbl>
1   2     4     7  
2   2     4     7.5
3   3.5   6.5   9.5

数据

代码语言:javascript
复制
my.list <- list(structure(1:9, .Dim = c(3L, 3L)), structure(c(2, NaN, 4, 
5, NaN, 7, 8, NaN, 10), .Dim = c(3L, 3L)), structure(c(3, 2, 
NaN, 3, 3, NaN, 6, 7, NaN), .Dim = c(3L, 3L)))
票数 1
EN

Stack Overflow用户

发布于 2021-07-13 08:57:45

代码语言:javascript
复制
  # input prepare
  A= matrix(1:9,nrow=3,ncol=3)
  B = matrix(2:10,nrow=3,ncol=3)
  B[2,] = NaN
  C =matrix(c(3,2,NaN,3,3,NaN,6,7,NaN),nrow=3,ncol=3)

  # flatten every matrix as a column of rowMeans big matrix
  # so rowMeans do element-wise process
  mat.as.vec.list = lapply(list(A,B,C), as.vector)
  bind.by.col= do.call(cbind, mat.as.vec.list)

  
  mean.by.row = rowMeans(bind.by.col, na.rm = T)

  #convert back to matrix
  dim(mean.by.row) = dim(A)
  mean.by.row

     [,1] [,2] [,3]
[1,]  2.0  4.0  7.0
[2,]  2.0  4.0  7.5
[3,]  3.5  6.5  9.5
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68355202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档