【问题标题】:Loop for deleting rows with column criteria循环删除具有列条件的行
【发布时间】:2012-10-02 07:44:32
【问题描述】:

我的循环有问题。它只是删除了 some 在我的欲望列中具有 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,]
    } 
  }
}

在网上搜索,我发现也许我可以使用 apply 功能...类似于:

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),] 
}

这引发了一个 dim(x) 错误...我想将零数设置为 NULL

我在想下面的东西,但显然它不好......只是想法......我真的不知道如何很好地使用apply函数

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

非常感谢您的有用帮助!

【问题讨论】:

  • 我认为不需要循环,只需确定要保留的内容和子集即可。但是我对您正在处理的数据结构感到困惑。是data.frameslist 吗?
  • @Tomas,您应该编辑并详细说明问题,我之所以关注是因为我阅读了您的最后一个问题,但每个问题都应该是独立且可重复的。

标签: r loops matrix apply


【解决方案1】:

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

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

ind 将有 TRUE 在适当的地方,你可以做

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)

应该可以的。

【讨论】:

    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2020-06-22
    • 2023-01-12
    相关资源
    最近更新 更多