如何按唯一编号删除多列中的行?

时间:2012-06-11 04:07:39

标签: r

给出这样的数据

C1<-c(3,-999.000,4,4,5)
C2<-c(3,7,3,4,5)
C3<-c(5,4,3,6,-999.000)
DF<-data.frame(ID=c("A","B","C","D","E"),C1=C1,C2=C2,C3=C3)

如何删除所有列中的-999.000数据

我知道每列都有效

DF2<-DF[!(DF$C1==-999.000 | DF$C2==-999.000 | DF$C3==-999.000),]

但我想避免引用每一列。我想有一种简单的方法可以引用特定数据框中的所有列:

DF3<-DF[!(DF[,]==-999.000),]

DF3<-DF[!(DF[,(2:4)]==-999.000),]

但显然这些不起作用

出于好奇,奖励积分,如果你能告诉我为什么我需要在结尾方括号之前的最后一个逗号,如:

==-999.000),]

4 个答案:

答案 0 :(得分:6)

以下可能有效

DF[!apply(DF==-999,1,sum),]

或者如果你可以连续多个-999

DF[!(apply(DF==-999,1,sum)>0),]

DF[!apply(DF==-999,1,any),]

答案 1 :(得分:5)

要解决您的“红利”问题,如果我们转到?Extract.data.frame的文档,我们会发现:

  

数据帧可以在多种模式下编制索引。使用[[[时   使用单个索引(x[i]x[[i]]),它们就像对数据框一样索引   这是一个清单。在这种用法中,忽略drop参数,使用a   警告。

还有:

  

[[[与两个索引(x[i, j]x[[i, j]])一起使用时,   就像索引矩阵一样:[[只能用于选择一个元素。   请注意,对于每个选定的列,xj通常会说(如果不是   类似矩阵),结果列将是xj[i],因此依赖于   相应的[方法,请参阅示例部分。

因此,您需要使用逗号来确保R知道您指的是行而不是列。

答案 2 :(得分:5)

根据您的代码,我假设您要删除包含-999的所有行。

DF2 <- DF[rowSums(DF == -999) == 0, ]

关于你的奖金问题:数据框是一个矢量列表,所有这些矢量都有相同的长度。如果我们将向量视为列,则可以将数据框视为矩阵,其中列可能具有不同的类型(数字,字符等)。 R允许您引用数据框的元素,就像引用矩阵的元素一样;通过使用行和列索引。因此,DF[i, j]指的是DF的i向量中的j元素,您可以将其视为第i行和j列。因此,如果您只想保留数据框和所有列的某些行,则可以使用类似矩阵的表示法:DF[row.indices, ]

答案 3 :(得分:2)

我不明白你的目标是要删除包含至少一个NA的所有行,如果这是你正在寻找的,那么这可能是一个可能的答案:

DF[DF==-999] <- NA
na.omit(DF)
   ID C1 C2 C3
1  A  3  3  5
3  C  4  3  3
4  D  4  4  6