我正在尝试编写一个函数,根据条件评估矩阵中的每个项。如果任何术语满足条件,则将整行添加到第二个矩阵。
(上下文:我这样做是为了比较所有属性的异常值。如果任何行有任何属性的异常数据(他们的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
}}
}
非常感谢您提供任何信息或输入。
答案 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
}
}
}
有更好的方法可以实现这种子集化。