在R中使用colSums识别全零列的结果异常及过滤问题咨询
问题原因分析与修正方案
关于列A对应FALSE的疑问
你搞反了colSums(df[,-1]) == 0的逻辑含义:这个表达式生成的逻辑向量里,TRUE代表对应列是全零列,FALSE代表该列不是全零列。列A的和是2+0+0=2,显然不是全零列,所以返回FALSE是完全正确的结果,不存在问题。
筛选结果不符合预期的原因
你贴出的代码和输出存在矛盾:根据你打印的zero_sum_cols结果,只有E列对应TRUE,那么df[, zero_sum_cols, drop=FALSE]应该返回E列,但你得到的是D列。这说明你实际运行的代码和你贴的不一致,大概率是以下两种情况:
- 误将逻辑判断写成了
colSums(df[,-1]) != 0(取反),导致筛选逻辑出错; - 变量
zero_sum_cols被之前的代码覆盖,实际存储的不是你打印的结果。
修正建议
根据你的需求分两种情况处理:
需求1:筛选出所有全零列(保留E列,可选择保留SP列)
# 标记数值列中的全零列 zero_sum_cols <- colSums(df[,-1]) == 0 # 给SP列添加FALSE标记(SP不是全零列),保留SP列+全零列 full_zero_cols <- c(FALSE, zero_sum_cols) result <- df[, full_zero_cols, drop = FALSE] print(result) # 输出结果: # SP E # 1 MCCB 0 # 2 ABC 0 # 3 DEF 0
需求2:筛选出所有非全零列(去掉E列,保留其他列)
将逻辑判断取反,同时保留SP列:
# 标记数值列中的非全零列 non_zero_cols <- colSums(df[,-1]) != 0 # 给SP列添加TRUE标记,保留SP列+非全零列 full_non_zero_cols <- c(TRUE, non_zero_cols) result <- df[, full_non_zero_cols, drop = FALSE] print(result) # 输出结果: # SP A B C D F # 1 MCCB 2 0 2 4 0 # 2 ABC 0 3 4 0 1 # 3 DEF 0 3 1 0 2
额外提示
如果只想处理数值列(去掉SP列),直接筛选df[,-1]即可:
# 筛选数值列中的全零列 num_zero_cols <- colSums(df[,-1]) == 0 result_num <- df[,-1][, num_zero_cols, drop = FALSE]
内容的提问来源于stack exchange,提问作者Umar
相关产品推荐
相关产品推荐

