R - 如果满足条件,则评估矩阵中的所有值并提取整行

时间:2017-05-31 18:17:08

标签: r statistics

我正在尝试编写一个函数,根据条件评估矩阵中的每个项。如果任何术语满足条件,则将整行添加到第二个矩阵。

(上下文:我这样做是为了比较所有属性的异常值。如果任何行有任何属性的异常数据(他们的z分数> 3),那么整行将被添加到异常值数据矩阵中)< / p>

请参阅下面的代码。我真的不明白它为什么不起作用。

outliers <- matrix()
x <- 1
for(r in nrow(all_z_stats)){
  for(c in ncol(all_z_stats)){
    if(all_z_stats[r,c]>3){
      outliers[x,] <- all_z_stats[r,]
      x <- x + 1
    }}
}

非常感谢您提供任何信息或输入。

2 个答案:

答案 0 :(得分:0)

测试数据:all_z_stats <- replicate(20, rnorm(20))

首先,for r in nrow(all_z_stats)只会导致一个r值。更好地循环遍历所有值,从1到nrow(all_z_stats)for (r in seq_len(all_z_stats)) = for (r in 1:nrow(all_z_stats))c相同)

第一项改进:

outliers <- matrix(ncol=ncol(all_z_stats)) # Empty matrix with as many cols as outliers matrix
for(r in seq_len(nrow(all_z_stats))){
    if(any(all_z_stats[r, ] > 3)){ # any is useful, try ?any in R console
        outliers <- rbind(outliers, all_z_stats[r, ]) # add line to outliers
    }
}

但你可以不用for循环来做到这一点。首先,找到条目&gt;的所有行索引。存在3(使用sapply。然后,仅从all_z_stats中提取这些索引:

outliers <- matrix(ncol=ncol(all_z_stats))
all_z_stats[sapply(seq_len(nrow(all_z_stats)), function(r) any(all_z_stats[r, ] > 3)), ]

答案 1 :(得分:0)

好吧,您可以将异常值定义为numeric()并使用rbind()来堆积矩阵,如下所示:

outliers <- numeric()

for(r in nrow(all_z_stats)){
  for(c in ncol(all_z_stats)){
    if(all_z_stats[r,c]>3){
      outliers <- rbind(outliers,all_z_stats[r,])
      break
    }
  }
}

有更好的方法可以实现这种子集化。