【问题标题】:removing rows from a matrix [closed]从矩阵中删除行[关闭]
【发布时间】:2014-12-19 20:42:54
【问题描述】:

我是 python 和 R 的新用户。我已经开始使用它们来尝试回答我遇到的科学问题。我想做的是以下几点:

  1. 对于矩阵,求每列的均值和标准差。
  2. 删除包含列均值 + 或 - 3 SD 之外的任何值的所有行。
  3. 删除这些行后,计算新的均值和标准差并重复此循环,直到不再有任何异常值。

这将使用大约 1000 行和 20 列的矩阵来完成。

我非常感谢任何指导,因为我真的只是在学习。谢谢!

【问题讨论】:

  • r-project.org 的介绍手册对 R 新手很有帮助。
  • 您好,欢迎来到 Stack Overflow!虽然我们很乐意提供帮助,但您的问题很广泛,请包括您尝试过的代码以及它的具体问题。请花点时间阅读stackoverflow.com/help/how-to-ask 并了解提出格式正确的问题的准则。
  • 我认为这重复了你的问题,但你可能会从中学到很多你需要的东西:stackoverflow.com/questions/18397805/… 阅读并编辑你的问题,向我们展示你真正陷入困境的地方。

标签: python r iteration


【解决方案1】:

你可以试试R:

  meanSDs <- apply(m1, 2, function(x) c(mean(x)+3*sd(x), mean(x)-3*sd(x)))
  any(m1 > meanSDs[1,][col(m1)] | m1 < meanSDs[2,][col(m1)])
  #[1] TRUE

创建一个函数

 fun1 <- function(mat,n){
                repeat{
                meanSDs <- apply(mat, 2, function(x) 
                                   c(mean(x)+n*sd(x), mean(x)-n*sd(x)))
                indx <-mat > meanSDs[1,][col(mat)] | mat < meanSDs[2,][col(mat)]
                indx1 <- !rowSums(indx)
                mat <- mat[indx1,]
                if(all(indx1)) break
                   }
               return(mat)
             }



   m2 <- fun1(m1,3)

检查结果

  meanSDs <- apply(m2, 2, function(x) c(mean(x)+3*sd(x), mean(x)-3*sd(x)))
  any(m2 > meanSDs[1,][col(m2)] | m2 < meanSDs[2,][col(m2)])
  #[1] FALSE

数据

 set.seed(79)
 m1 <- matrix(rnorm(1000*20,1,8), ncol=20)

【讨论】:

  • 感谢大家的回复。我将开始使用此帮助并发布我遇到的任何问题。
  • akrun,非常感谢。我花了一个星期才弄清楚你做了什么,但这很有效。它还帮助我学习了如何组织这些问题。非常感谢!
  • @Samwise327 没问题。对于这类问题,我会使用whilerepeat
猜你喜欢
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 2013-07-22
  • 1970-01-01
相关资源
最近更新 更多