2014-02-03 3 views
11

У меня есть data.frame:Удалить столбцы с нулевыми значениями из dataframe

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 dataframe и:

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

который дает ошибку.

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

ответ

22

У вас его почти нет. Поместите эти два вместе:

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

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

+0

Это работает с НС? – Fernando

+0

Нет, это не работает с значениями 'NA'. Если присутствует значение «NA», замените тест на '! Is.na (colSums (SelectVar! = 0)) & colSums (SelectVar! = 0)> 0' (или эквивалент). –

+0

С помощью 'NA' просто попробуйте:' SelectVar [, colSums (SelectVar! = 0, na.rm = TRUE)> 0] ' – mpalanco

2

Попробуйте также

SelectVar[, !apply(SelectVar == 0, 2, all)] 

Это было взят отсюда:

Delete all columns with 0 from matrix

+0

Скорее всего, это будет медленнее, особенно в больших наборах данных. Кроме того, я думаю, что OP ищет 'any' not' all'. – A5C1D2H2I1M1N2O1R2T1

+0

Возможно, я просто скопирую вставить сообщение. Кажется, все работает нормально. – Fernando

0

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

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) 
Смежные вопросы