R 中数据操作的一项常见任务是通过删除符合特定条件的行来对数据帧进行子集化。但是,在 R 中执行此操作的简单方法似乎在逻辑上不一致,甚至对于没有经验的人(比如我自己)来说也是危险的。
假设我们有一个数据框,我们想要排除属于“G1”处理的行:
Treatment=c("G1","G1","G1","G1","G1","G1","G2","G2","G2","G2","G2",
"G2","G3","G3","G3","G3","G3","G3")
Vals=c(runif(6),runif(6)+0.9,runif(6)-0.3)
data=data.frame(Treatment)
data=cbind(data, Vals)
正如预期的那样,下面的代码删除了与第一行条件匹配的数据帧行
to_del=which(data$Treatment=="G1")
new_data=data[-to_del,]
new_data
但是,与预期相反,如果“which”命令未找到任何匹配的行,则使用此方法,此代码将删除所有行而不是单独保留它们
to_del=which(data$Treatment=="G4")
new_data=data[-to_del,]
new_data
上面的代码导致数据框没有剩余行,这是没有意义的(即,由于 R 没有找到符合我的删除条件的行,因此它删除了所有行)。我的解决方法可以完成这项工作,但我想有一种更简单的方法可以在没有所有这些条件语句的情况下做到这一点
###WORKAROUND
to_del=which(data$Treatment=="G4") #no G4 treatment in this particular data frame
if (length(to_del)>0){
new_data=data[-to_del,]
}else{
new_data=data
}
new_data
有没有人有一个简单的方法来做到这一点,即使没有行匹配指定的条件?