2012-06-11 53 views
4

这样如何通过唯一编号删除多列中的行?

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),] 
+0

此言在一个答案 - 我可以在给定的行 – Vinterwoo

回答

6

以下可能工作

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

,或者如果你能在一行

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

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

爱好任何函数以及多个-999值。谢谢! – Vinterwoo

5

为了解决你的 “红利” 问题有多种-999,如果我们去?Extract.data.frame的文档我们会发现:

数据框架可以以多种模式建立索引。当[[[被用于具有单个索引(x[i]x[[i]])的 时,它们索引数据帧,就好像 它是一个列表。在此用法中,将忽略掉参数,并发出 警告。

和也:

[时和[[使用具有两个索引(x[i, j]x[[i, j]])它们 行为像索引的矩阵:[[只能被用于选择一个元素。 请注意,对于每个选定列,通常(如果不是 矩阵),结果列将为xj[i],因此依赖于 对应的[方法,请参阅示例部分。

所以你需要用逗号来确保R知道你指的是一行而不是一列。

5

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

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

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

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