1

我有一个包含流行病学数据(48232 行和 74 列)的大型数据框。我将它作为 .csv 文件读入 R 并使用命令 na.strings="NA"。我有几个二分变量,YES/NO 答案编码为 0=YES,1=NO。这些变量也包含 NA。我想创建一个包含所有列的新数据框,但删除那些具有 Diab=0 的样本,而不是删除 Diab=NA。我为此使用方括号。这样做时,新数据框的维度是正确的,但是,对于新数据框中的所有其他二分变量,所有 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")

我已经阅读了关于神秘 NA 行的这个 SO 问题关于子集与括号的邮件列表线程, 但不幸的是,即使它看起来有点熟悉,它也没有帮助我......

任何帮助我都会非常高兴!谢谢,夏洛塔

4

2 回答 2

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

您明白了。该脚本无法在数据框中选择正确的行,因为它返回NAs ,因此您在子集数据框中得到NAs 。

解决方案:要么将NAs 更改为您可以更轻松处理的内容(如果需要),要么调整脚本以对针对NA值调整的数据进行子集化。is.na()是可以用于这种情况的函数。因此,让我们选择所有不等于 0 的值或NADiab 列中的值:

> 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

有关缺失值的更多信息,请查看此处

于 2013-04-10T11:45:34.250 回答
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

于 2013-04-10T11:27:54.810 回答