R语言如何删除满足指定行求和及列值条件的数据框行
需求说明
现有一个140列、2000行的数据框,需要删除同时满足以下两个条件的行:
- 第2列至第131列的行求和结果等于1
Seizuremultidiscrete、Seizuresingle、Seizurestatus三个字段中任意一个值为1
原编写的运行失败的代码如下:
bupro%>%select(bupro[rowSums(bupro[2:131]==1)]&&((bupro["Seizuresingle"] =1 | bupro["Seizuresstatus"]| bupro["Seizuresmultidiscrete"|=1))
原代码问题点
- 函数用错:删除/筛选行应该用
filter,select是用来选列的函数 - 符号错误:R中逻辑判断相等用双等号
==,原代码多处用了赋值的单等号= - 语法错误:括号错位未闭合,逐行向量判断的逻辑与应该用
&,原代码用了适用于单值判断的&& - 逻辑错误:
rowSums(bupro[2:131]==1)是统计指定列中值为1的单元格个数,不是对列值本身求和 - 写法冗余:dplyr管道操作中不需要反复引用原始数据框名,直接调用列名即可
正确实现代码
dplyr管道写法(适配原代码的管道使用习惯)
library(dplyr) bupro_clean <- bupro %>% filter( # 对「同时满足两个删除条件」的结果取反,保留需要留下的行 !( # 条件1:第2-131列逐行求和等于1 rowSums(across(2:131), na.rm = TRUE) == 1 & # 条件2:三个指定列任意一个值为1 (Seizuremultidiscrete == 1 | Seizuresingle == 1 | Seizurestatus == 1) ) )
注意:如果数据中存在缺失值NA,请保留na.rm = TRUE参数,避免求和结果返回NA导致行被误删;确认无缺失值可删除该参数。
基础R写法
# 生成两个判断条件的逻辑向量 cond_sum <- rowSums(bupro[, 2:131], na.rm = TRUE) == 1 cond_seizure <- (bupro$Seizuremultidiscrete == 1 | bupro$Seizuresingle == 1 | bupro$Seizurestatus == 1) # 剔除同时满足两个条件的行 bupro_clean <- bupro[!(cond_sum & cond_seizure), ]
内容的提问来源于stack exchange,提问作者Omid Mehrpour
相关产品推荐
相关产品推荐

