使用索引变量中的NA子集R数据帧

时间:2013-04-10 11:19:31

标签: r

我有一个包含流行病学数据的大型数据框(48232行和74列)。我把它作为.csv文件读入R并使用命令na.strings =“NA”。我有几个二分变量,YES / NO答案编码0 = YES,1 = NO。这些变量还包含NA。我想创建一个包含所有列的新数据框,但删除那些Diab = 0, NOT 删除Diab = NA的样本。我用这个方括号。这样做时,新数据框的尺寸是正确的,但是,对于新数据框中的 ALL 其他二分变量,Diab = NA的所有样本最终都为NA!我该如何解决这个问题?我试图生成一个小例子:

   Diab<-c(0,NA,1,1,1,0,0,NA, NA)
INF<-c(0,1,1,1,1,1,NA, 0,1)
HYP<-c(NA, 0,1,0,NA,1,1,1,1)

a<-data.frame(cbind(Diab, INF, HYP))
dim(a)
table(a$Diab,a$HYP, exclude=NULL, dnn=c("Diab", "HYP"))
#In total 2 persons HYP=0, 5 persons HYP=1, 2 persons HYP=NA. 

b<-a[!a$Diab==0,]
dim(b)
##When removing those Diab=0 I'm expecting to still have 2 persons HYP=0, 
#3 persons HYP=1 and 1 person HYP=NA, but not...

table(b$HYP, exclude=NULL, dnn="HYP")
#6 persons in total but those that were Diab=NA are now turned into HYP=NA??

#The same happens with the INF variable.
table(a$Diab,a$INF, exclude=NULL, dnn=c("Diab", "INF"))
table(b$INF, exclude=NULL, dnn="INF")

我已阅读此SO question on mysterious NA rowsthis mailing list thread on subsetting vs. bracketing 但不幸的是,即使看起来有点熟悉,它对我没有帮助......

我会非常高兴能得到任何帮助! 谢谢,Charlotta

2 个答案:

答案 0 :(得分:3)

问题在于您尝试对包含NA的数据列进行子集化。您必须制定一种更有效的方法来对数据集进行子集化。

正如你所写:

> a$Diab
[1]  0 NA  1  1  1  0  0 NA NA

这些值中的哪一个不等于零?

> !a$Diab==0
[1]  TRUE    NA FALSE FALSE FALSE  TRUE  TRUE    NA    NA

如你所见。在评估NA:s时,你得到NA:s作为答案。以同样的方式,您无法执行以下操作:

> c(NA,NA,3)+1
[1] NA NA  4

您明白了...脚本无法在数据框中选择正确的行,因为它会返回NA,因此您会在子集数据框中获得NA

解决方案:将NA更改为您可以更轻松地处理的内容(如果需要),或调整脚本以更新为NA值调整的数据。 is.na()是一个可用于此案例的函数。因此,让我们在Diab列中选择所有值不等于0或值为NA的值:

> a[(a$Diab != 0) | is.na(a$Diab),]
  Diab INF HYP
2   NA   1   0
3    1   1   1
4    1   1   0
5    1   1  NA
8   NA   0   1
9   NA   1   1

有关缺失值的更多信息,请look here

答案 1 :(得分:0)

我认为这可以满足您的需求:

> a[(a$Diab != 0) | is.na(a$Diab),]
  Diab INF HYP
2   NA   1   0
3    1   1   1
4    1   1   0
5    1   1  NA
8   NA   0   1
9   NA   1   1

您需要在Diab中找到不等于零(!= 0)或等于NAis.na)的条目。布尔运算符|表示OR