删除包含特定数据的行。

4

在我的数据框中,第一列是一个因子(factor),我想删除具有某个factorname值(当该值存在时)的行。我尝试了:


```R df <- df[-which(df$factorname == "value"), ] ```
df <- df[-grep("factorname",df$parameters),]

当目标因素名称存在时,该方法效果良好。但是,如果因素名称不存在,该命令会破坏数据框架,使其行数为0。因此,我尝试了以下方法:

df <- df[!apply(df, 1, function(x) {df$parameters == "factorname"}),]

如何测试是否存在factorname并删除该行,而不是删除有问题的行。


你所举例的危险情况同样适用于使用“-which(...)" 策略。 - IRTFM
也许可以通过 df[!apply(df, 1, function(x) {x['parameters'] == "factorname"}),] 来成功,尽管这看起来相当笨重。你将会对每一行测试一个值,而不是将整个向量与每个 apply 迭代一起发送到“==”中。 - IRTFM
2个回答

7
您可以使用以下方法:

df[ which( ! df$parameter %in% "factorname") , ]

我使用了%in%运算符,因为它能更好地适应多个排除条件。也可以采用以下方法:

df[ !grepl("factorname", df$parameter) , ]

2
仅使用 df[df$parameters!="factorname",] 不就足够了吗?我错过了什么额外的复杂性? - thelatemail
是的,忽略了显而易见的问题。就像thelatemail所说的那样。 - IRTFM

2
l<-sapply(iris,function(x)is.factor(x)) # test for the factor variables
>l
Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
       FALSE        FALSE        FALSE        FALSE         TRUE 

m<-iris[,names(which(l=="TRUE"))]) #gives the data frame of factor variables only
iris[iris$Species !="setosa",] #generates the data with Species other than setosa 



   > head(iris[iris$Species!="setosa",])
   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
51          7.0         3.2          4.7         1.4 versicolor
52          6.4         3.2          4.5         1.5 versicolor
53          6.9         3.1          4.9         1.5 versicolor
54          5.5         2.3          4.0         1.3 versicolor
55          6.5         2.8          4.6         1.5 versicolor
56          5.7         2.8          4.5         1.3 versicolor

1
所有的sapply和子集操作在这个简单的查询中真的有必要吗?如果我刚开始学习R,在看到关键行之前我会感到非常困惑。 - thelatemail
同意;我认为 OP 是在寻找检查所有因子变量的方法。 - Metrics

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接