如何在R中删除空列或求和为0的列
解决大CSV文件中删除求和为0的列的问题
针对你的需求,结合你使用的dplyr/tidyverse和vroom,可以通过以下两种可靠方法删除求和为0的列,同时保留样本名称列(...1):
方法一:使用dplyr::select() + where()
直接筛选出数值列中求和不为0的列,同时保留第一列样本名:
library(tidyverse) library(vroom) # 读取数据(如果还未读取) df <- vroom("你的文件路径.csv") # 清理数据:保留样本列,删除求和为0的数值列 df_cleaned <- df %>% select(...1, where(~ is.numeric(.x) && sum(.x) != 0))
方法二:先筛选列名再选取
先单独处理数值列的求和筛选,再合并样本列:
# 提取数值列中求和不为0的列名 valid_numeric_cols <- df %>% select(-...1) %>% # 排除样本名字符列 colSums() %>% keep(. != 0) %>% # 保留求和不为0的列 names() # 组合样本列和有效数值列 df_cleaned <- df %>% select(...1, all_of(valid_numeric_cols))
对你之前遇到问题的解释
- 改编行处理代码报错:行处理的
keep参数是针对行索引设计的,列筛选需要用select()而非行操作函数,两者逻辑完全不同。 - which函数选中所有列:你大概率没排除字符型的
...1列,colSums()对字符列会返回NA,而NA != 0会被判定为TRUE,导致所有列被误选。必须先排除非数值列再计算列求和。 - janitor::remove_empty无效:这个函数是删除全为
NA或空值的列,不是求和为0的列,完全不适用你的场景。 - Excel宏崩溃:10000+列的大文件远超Excel的内存处理上限,用R处理这类大文件更合适。
- Stack代码过度删减:大概率是代码默认筛选了求和大于某个阈值(而非不等于0),或者没排除样本列导致正常列被误删。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

