如何删除data frame中两行值均为非零的对应列
实现方案
你要的规则本质是仅删除所有值都不为0的列,保留存在至少1个0的列,可以用基础R或者dplyr快速实现,不需要写复杂的if else判断:
第一步:构造示例测试数据
df <- data.frame( Dogs = c(1, 2), Cats = c(0, 1), Snakes = c(1, 0), Elephants = c(3, 2) )
方法1:基础R实现
直接通过列求和逻辑筛选符合要求的列即可:
# colSums(df == 0) 统计每列中0的个数,大于0说明存在至少1个0,保留该列 result <- df[, colSums(df == 0) > 0]
方法2:dplyr实现
用select()搭配where()列选择器即可实现列级别的条件筛选:
library(dplyr) result <- df %>% # any(.x == 0) 判断当前列是否存在至少1个0,是则保留 select(where(~ any(.x == 0)))
输出结果验证
两种方法得到的结果完全符合你的要求:
print(result) # Cats Snakes # 1 0 1 # 2 1 0
补充说明
如果你的数据中存在NA值,只需要在判断逻辑中加na.rm = TRUE参数避免判断异常,例如dplyr写法调整为:
result <- df %>% select(where(~ any(.x == 0, na.rm = TRUE)))
该逻辑同样适用于超过2行的dataframe,规则通用。
内容的提问来源于stack exchange,提问作者user305902
相关产品推荐
相关产品推荐

