按多列特定值删除R DataFrame行失败:误删同组行的解决方法
解决R中删除特定复合条件行的问题
你遇到的问题其实是逻辑条件的逻辑关系搞反啦!咱们先拆解一下错误原因:
你写的df$v1!=1 & df$v2!=457 & df$v3!=659,意思是同时满足v1不等于1、v2不等于457、v3不等于659的行才会被保留。那所有v1=1的行,因为v1!=1不成立,整个条件就为假,自然会被全部过滤掉,这就和你的需求不符了。
你的真实需求是删除“v1=1 且 v2=457 且 v3=659”的那一行,也就是保留所有不满足这个复合条件的行,所以我们需要对这个复合条件取反,用!()包裹起来就行。
正确的实现方式
方式1:使用subset函数
subset(df, !(v1 == 1 & v2 == 457 & v3 == 659))
方式2:使用索引筛选
df[!(df$v1 == 1 & df$v2 == 457 & df$v3 == 659), ]
方式3:用dplyr包更直观(推荐)
如果你习惯用tidyverse风格的代码,可以用dplyr的filter函数:
library(dplyr) df %>% filter(!(v1 == 1 & v2 == 457 & v3 == 659))
验证一下
咱们先运行你的数据创建代码:
v1<-c(1,1,1,1,2,2,2,2,3,3,3,3) v2<-c(234,457,234,675,235,205,347,578,695,783,200,697) v3<-c(528,659,102,236,358,562,987,102,235,474,888,362) df<- data.frame(v1,v2,v3)
然后用上面的正确代码,你会发现只有第2行(v1=1、v2=457、v3=659)被删除,其他v1=1的行都保留下来了,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Cisco
相关产品推荐
相关产品推荐

