给出这样的数据
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 :(得分: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