从数据框中删除零值的列

时间:2014-02-03 14:40:09

标签: r dataframe

我有一个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

产生一个真/假数据帧,并且:

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

会产生错误。

如何删除每行中值为零的列?

9 个答案:

答案 0 :(得分:35)

你几乎拥有它。将这两者放在一起:

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

这是有效的,因为因子列被评估为> = 1的数字。

答案 1 :(得分:4)

对dplyr友好的解决方案:

SelectVar %>% select_if(colSums(.) != 0)

答案 2 :(得分:3)

尝试

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

这是从这里取的:

Delete all columns with 0 from matrix

答案 3 :(得分:1)

根据平均执行时间,较快的选项约为40%

np.T

我们可以用一个简单的示例数据框架(包括3,000列和两个观察值)对这两个选项进行基准测试。

list_imp  =  [1,5,7,5,2,7,4,7,2,8,8,3,0,9,6,9]
df = pd.DataFrame(np.array(list_imp).reshape(-1,4).T, columns=['A', 'B', 'C', 'D'])

   A  B  C  D
0  1  2  2  0
1  5  7  8  9
2  7  4  8  6
3  5  7  3  9

答案 4 :(得分: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)

答案 5 :(得分:0)

您可以尝试

   [row, column] = SelectVar.shape
    for j in range(column):
       if np.all(SelectVar.iloc[:, j] == 0):
           SelectVar = SelectVar.drop(SelectVar.columns[j], axis=1, inplace=True)

答案 6 :(得分:0)

最新答案,但可以在这里使用的其他基本R方法是断言每列的最小值或最大值不是 零:

colMax <- sapply(SelectVar, max, na.rm=TRUE)
colMin <- sapply(SelectVar, min, na.rm=TRUE)
SelectVar[, colMin != 0 | colMax != 0]

答案 7 :(得分:0)

dplyr 1.0.0起的一种选择可能是:

df %>%
 select(where(~ any(. != 0)))

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

答案 8 :(得分:0)

以上所有答案都有效-
但对于我们中的一些人来说,按照目标 remove columns with zero values 阅读的最直观的解决方案可能是:

df %>% select(where(~ sum(.) != 0))

你可以把它读成:
For every column (~), remove it (!=) if its sum (sum(.)) is zero