Удалить столбцы с нулевыми значениями из фрейма данных

У меня есть data.frame:

SelectVar
     a   b  c   d   e   f   g   h   i j k l ll m n o p  q   r
1 Dxa8 Dxa8 0 Dxa8 Dxa8 0 Dxa8 Dxa8 0 0 0 0  0 0 0 0 0 Dxc8 0
2 Dxb8 Dxc8 0 Dxe8 Dxi8 0 tneg tpos 0 0 0 0  0 0 0 0 0 Dxi8 0

Я хотел бы удалить столбцы с нулевыми значениями в обеих строках из фрейма данных, поэтому он дает кадр данных, как показано ниже:

SelectVar
     a   b    d    e    g   h     q   
1 Dxa8 Dxa8 Dxa8 Dxa8 Dxa8 Dxa8  Dxc8 
2 Dxb8 Dxc8 Dxe8 Dxi8 tneg tpos  Dxi8 

Попробовали:

SelectVar!=0

который дает True/False фрейм данных и:

SelectVar[, colSums(abs(SelectVar)) ! == 0]

что дает ошибку.

Как удалить столбцы с нулевыми значениями в каждой строке?

Ответ 1

У тебя это почти есть. Поместите эти два вместе:

 SelectVar[, colSums(SelectVar != 0) > 0]

Это работает, потому что столбцы факторов оцениваются как числовые, >= 1.

Ответ 3

Чтобы удалить все и все столбцы, содержащие только нули, просто передайте свой фрейм данных в следующую функцию:

remove_zero_cols <- function(df) {
  rem_vec <- NULL
  for(i in 1:ncol(df)){
    this_sum <- summary(df[,i])
    zero_test <- length(which(this_sum == 0))
    if(zero_test == 6) {
      rem_vec[i] <- names(df)[i]
    }
  }
  features_to_remove <- rem_vec[!is.na(rem_vec)]
  rem_ind <- which(names(df) %in% features_to_remove)
  df <- df[,-rem_ind]
  return(df)
}

Пример:

iris$Sepal.Width <- 0
new_df <- remove_zero_cols(iris)
print(new_df)