给出这样的数据
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)
Run Code Online (Sandbox Code Playgroud)
如何删除所有列中的-999.000数据
我知道每列都有效
DF2<-DF[!(DF$C1==-999.000 | DF$C2==-999.000 | DF$C3==-999.000),]
Run Code Online (Sandbox Code Playgroud)
但我想避免引用每一列.我想有一种简单的方法来引用特定数据框中的所有列,也就是:
DF3<-DF[!(DF[,]==-999.000),]
Run Code Online (Sandbox Code Playgroud)
要么
DF3<-DF[!(DF[,(2:4)]==-999.000),]
Run Code Online (Sandbox Code Playgroud)
但显然这些都行不通
出于好奇,奖励积分,如果你能告诉我为什么我需要在结束方括号之前的最后一个逗号,如:
==-999.000),]
Run Code Online (Sandbox Code Playgroud)
以下可能有效
DF[!apply(DF==-999,1,sum),]
Run Code Online (Sandbox Code Playgroud)
或者如果你可以连续多个-999
DF[!(apply(DF==-999,1,sum)>0),]
Run Code Online (Sandbox Code Playgroud)
要么
DF[!apply(DF==-999,1,any),]
Run Code Online (Sandbox Code Playgroud)
为了解决您的"奖金"问题,如果我们转到文档,?Extract.data.frame我们会发现:
数据帧可以以多种模式索引.当
[和[[单个索引(x[i]或x[[i]])一起使用时,它们将数据框索引为就像它是一个列表一样.在此用法中,将忽略drop参数,并显示警告.
并且:
当
[和[[两个索引(x[i, j]和x[[i, j]])一起使用时,它们就像索引矩阵一样:[[只能用于选择一个元素.请注意,对于每个选定的列,xj例如,通常(如果它不是矩阵),结果列将是xj[i],因此依赖于相应的[方法,请参阅示例部分.
因此,您需要使用逗号来确保R知道您指的是行而不是列.
小智 5
根据您的代码,我假设您要删除包含-999的所有行.
DF2 <- DF[rowSums(DF == -999) == 0, ]
Run Code Online (Sandbox Code Playgroud)
至于你的奖金问题:数据框是一个矢量列表,所有这些矢量都有相同的长度.如果我们将向量视为列,则可以将数据框视为矩阵,其中列可能具有不同的类型(数字,字符等).R允许您引用数据框的元素,就像引用矩阵的元素一样; 通过使用行和列索引.因此,DF[i, j]引用DF的向量中的ith元素j,您可以将其视为第ith行和j第th列.因此,如果您只想保留数据框和所有列的某些行,则可以使用类似矩阵的表示法:DF[row.indices, ].