用于删除具有列条件的行的循环

时间:2012-10-02 07:44:32

标签: r loops matrix apply

我的循环问题。它只是删除了我的欲望栏中有0或NA值的一些行,我不知道为什么:

for (i in 1:105) {
  for (j in 1:l[i+1]){
    if(m[[i]][j,12]==0 | is.na(m[[i]][j,12])) {
      m[[i]]=m[[i]][-j,]
    } 
  }
}

在网上搜索我看到也许我可以使用应用功能...类似于:

for( i in 1:105){m[[i]]<-m[[i]][!apply(is.na(m[[i]]), 1, any),]}

for( i in 1:105){
  as.null(0)
  m[[i]]<-m[[i]][!apply(is.null(m[[i]]), 1, any),] 
}

这会引发一个暗淡的(x)错误...我想将零号设置为NULL

我正在考虑如下事情,但显然它并不好......它只是想法......我真的不知道如何使用应用功能

for( i in 1:105){as.null(0) m[[i]]<-!apply(m[[i]],1,is.null(m[[i]])) }

非常感谢您的有用帮助!

1 个答案:

答案 0 :(得分:1)

使用apply在数组的边缘上应用函数,但我认为这不是最好的想法,因为您只需要正确地对矩阵进行子集化。让我们只关注一个矩阵m

ind = m[,12] == 0 | is.na(m[,12])

indTRUE适当且您可以

m = m[!ind, ] # m is a matrix, not the list

删除行。你可以将它放在循环中,或者使用lapply(在列表中应用函数),但首先你需要一个函数应用于列表中的每个元素(所有105矩阵),所以

removeRows = function(m) {
ind = m[,12] == 0 | is.na(m[,12])
m   = m[!ind, ]
return(m)
}

m = lapply(m, FUN=removeRows)

这应该有效。