我正在处理矩阵中存储的大量数据,我想删除一列中的值不在[0,1]
范围内的所有行。如果矩阵是M
(仅是3 x 3矩阵的示例),我尝试使用此代码
m<-matrix(c(1,0,2,0.7,0.8,0.5,-0.6,0.11,0.4),3,3)
[,1] [,2] [,3]
[1,] 1 0.7 -0.60
[2,] 0 0.8 0.11
[3,] 2 0.5 0.40
对于此示例,我应该删除第一行和第三行。我想到的唯一解决方案是基于for循环和
for(i in 1:n){
array[i]<-sum(m[i,]<0, na.rm=TRUE)+sum(m[i,]>1, na.rm=TRUE)
}
for(i in 1:nrow(m)){
if (array[i]!=0){
m<-m[-i,]
array<-array[-i]
}
}
有没有更有效的解决方案?谢谢!
答案 0 :(得分:1)
我们可以直接按元素比较矩阵的值并创建逻辑矩阵,然后使用rowSums
m[rowSums(m <= 1 & m >= 0) == ncol(m), ]
#[1] 0.00 0.80 0.11
或者另一种做同一件事的方法
m[rowSums(m > 1 | m < 0) == 0, ]
对于上述两个版本,我们还可以将apply
与margin = 1
逐行使用,以对数据进行子集
m[apply(m <= 1 & m >= 0, 1, all), ]
m[!apply(m > 1 | m < 0, 1, any), ]
答案 1 :(得分:1)
还有一种可能性:
m[apply(m, 2, function(x) all(x >= 0) & all(x <= 1)), ]
[1] 0.00 0.80 0.11