如果列的和在R中等于0,则删除该列

如果列的和在R中等于0,则删除该列,r,R,我已经创建了一个for循环来迭代我的train数据集中的每一列。它检查列值的绝对和是否等于0,如果是,它将在名为“aux”的列表中存储列名称。在循环结束时,我指定train删除“aux”中的列 问题:我一直收到错误消息“error in-aux:一元运算符的参数无效” 关于数据集的说明:没有NAs或NaN,所有值都是数字。目前它是一个矩阵,但如果需要,我可以转换成数据帧 aux = NULL #auxiliary vector for(i in 1:ncol(train)){ #checking

我已经创建了一个for循环来迭代我的train数据集中的每一列。它检查列值的绝对和是否等于0,如果是,它将在名为“aux”的列表中存储列名称。在循环结束时,我指定train删除“aux”中的列

问题:我一直收到错误消息“error in-aux:一元运算符的参数无效”

关于数据集的说明:没有NAs或NaN,所有值都是数字。目前它是一个矩阵,但如果需要,我可以转换成数据帧

aux = NULL #auxiliary vector
for(i in 1:ncol(train)){ #checking all columns of the df
  
  if(sum(abs(train[,i]))==0){ #if the sum of the column is zero (using absolute value to avoid problems where the positive and negative numbers sum to zero)
    
    aux = c(aux,i) #then store the number of that column
    
  }
  
}


train = train[,-aux] #and remove the columns

我们可以使用
Filter

Filter(function(x) sum(abs(x), na.rm = TRUE) > 0, train)

或使用
colSums

train[colSums(abs(train), na.rm = TRUE) > 0]

您的错误表明,
aux
仍然是
NULL
,因此没有任何列添加到0。请注意,您正在对绝对值求和,因此如果整列为零,
aux
将只追加
i
。在这种情况下,您的整个循环可以替换为
train[sapply(train,function(x)!all(x==0)),]
您是对的,我在您发布评论时就注意到了问题,哈哈。所以现在我有一个新问题。最后一行代码
train=train[,-aux]
将删除数据集中的所有变量,而不仅仅是aux中的变量。这非常有效。我使用了你提供的第二个选项。知道如何在测试数据集中删除相同的列吗?我曾考虑过使用for循环来实现此目的,但之前没有成功,所以我知道我编码错了。@RehankhanDaya您可以使用
i10
获得一个逻辑向量,该向量可用于获取列名。i、 e.
names(which(i1))
或对于拖放的列
names(which(!i1))