我有一个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]
会产生错误。
如何删除每行中值为零的列?
答案 0 :(得分:35)
你几乎拥有它。将这两者放在一起:
SelectVar[, colSums(SelectVar != 0) > 0]
这是有效的,因为因子列被评估为> = 1的数字。
答案 1 :(得分:4)
对dplyr友好的解决方案:
SelectVar %>% select_if(colSums(.) != 0)
答案 2 :(得分:3)
答案 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