我有一个包含流行病学数据的大型数据框(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 rows和this mailing list thread on subsetting vs. bracketing 但不幸的是,即使看起来有点熟悉,它对我没有帮助......
我会非常高兴能得到任何帮助! 谢谢,Charlotta
答案 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
)或等于NA
(is.na
)的条目。布尔运算符|
表示OR
。