从矩阵中删除行

时间:2014-10-24 02:40:42

标签: python r iteration

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

  1. 对于矩阵,找到每列的均值和标准差。
  2. 删除包含列平均值+或 - 3 SD之外的任何值的所有行。
  3. 删除这些行后,计算新的均值和标准差,并重复此循环,直到不再有任何异常值。
  4. 这将使用大约1000行和20列的矩阵来完成。

    我很感激任何指导,因为我只是在学习。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以尝试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)