奇怪" NA.123" R数据框中的行

时间:2015-09-26 04:11:54

标签: r indexing dataframe na

我对R有一个非常奇怪的问题。有些动作在数据帧中生成NA记录,这些记录不是真实的" NAs - 它们在原始数据集中没有行,行ID表示像NA.123那样奇怪而不是实际行号,并且它们匹配== 1的测试。

很难描述正在发生的事情,所以我会让评论很多的代码完成大部分讨论。此处引用的数据文件是来自NHANES 2005数据集的一个小型(187 K)公开文件,如果有人想要它,可在http://wwwn.cdc.gov/Nchs/Nhanes/2005-2006/COT_D.XPT获得,以便他们可以尝试复制问题。

我正在创建一个是/否变量来评估可替宁血液测试是阳性还是阴性,使用10的截止值来定义阳性测试。在下面的代码中,我采用了两种不同的方式,创建" cotpos1"和" cotpos2"说明我在解决此问题时发现的一些内容。

为了这篇文章的目的,一个好的NA"是一个应该是NA的东西,因为原始的血液测试结果丢失了,而且一个坏的NA"是原始数据中没有的神秘行之一,每个值都是NA(包括原始数据中任何行都没有丢失的SEQN),行号显示为某些内容比如NA.123,每列中的NA匹配== 1.

此数据集使用名为SEQN的字段来标识每条记录。一开始,没有记录没有SEQN,所以当"坏NAs"稍后出现,他们的SEQNs也是NA(以及行中的其他所有内容),这表明我正在添加行。

我可以通过其他方式做到这一点,不会产生错误的NAs",比如使用ifelse()或使用重新编码的软件包,所以我的问题不是关于如何使这项工作 - 它"为什么下面的代码中使用的方法会产生奇怪的NA.123行?"

library(foreign) # To open SAS xpt files

# Read in the data files
testdata <- read.xport('COT_D.xpt')

################# cotpos1, everything set to 0 or 1 #################

testdata$cotpos1[testdata$LBXCOT >= 10] <- 1 # Positive cotinine test
testdata$cotpos1[testdata$LBXCOT < 10] <- 0 # Negative cotinine test

testdata$cotpos1[testdata$cotpos1==1] # We have NAs that match ==1
testdata[testdata$cotpos1==1,c("SEQN","cotpos1")] # The bad NAs have no SEQN and their row numbers look like NA.988
testdata[is.na(testdata$cotpos1),c("SEQN","cotpos1")] # The good NAs (ones that are NA because LBXCOT was NA, and match is.na()) have SEQN and row numbers

################# cotpos2, with initialization to 0 #################

testdata$cotpos2 <- 0 # Assume everyone is negative until found otherwise
testdata$cotpos2[testdata$LBXCOT >= 10] <- 1 # Positive cotinine test

# 3 tests to show we have no "bad NAs" at this point
testdata$cotpos2[testdata$cotpos2==1] # No NAs that match ==1
testdata[testdata$cotpos2==1,c("SEQN","cotpos2")] # No lines with no SEQN values or strange row IDs like NA.988
testdata[is.na(testdata$cotpos2),c("SEQN","cotpos2")] # No good NAs either because we initialized everyone to 0

# Now let's try finding the "good NA"s and setting them to NA (since they were initialized to 0, which is not accurate if the blood test results were actually missing)
testdata$cotpos2[is.na(testdata$LBXCOT)] <- NA

# Re-run the three tests, and they now show the bad NAs are back as well
testdata$cotpos2[testdata$cotpos2==1] # Now there are NAs that match ==1
testdata[testdata$cotpos2==1,c("SEQN","cotpos2")] # Now there are lines with NA SEQN values and strange row IDs like NA.988
testdata[is.na(testdata$cotpos2),c("SEQN","cotpos2")] # These are the "good NAs" only, the bad ones don't show up here

我可以通过其他方式做到这一点,不会产生错误的NAs&#34;,比如使用ifelse()或使用重新编码的软件包,所以我的问题不是关于如何使这项工作 - 它&#34;为什么上面代码中使用的方法会产生奇怪的NA.988行?&#34;

响应BondedDust的更多信息: 谢谢您的回复。你能否澄清一下[]你指的是哪个怪癖?

我知道这个怪癖,如果你喂它一个NA,你得到一个全NA行,例如:

b = testdata$cotpos1==1
b
testdata[b,c("SEQN","cotpos1")]

然后b是NA,我应该期望最后一行返回NA。那是你指的那个吗?不幸的是,在我的代码中,问题是奇怪的NA行出现在b不是NA的地方,所以怪癖不会解释它。

以下是b的最后几行:

[8725]  TRUE    NA FALSE FALSE    NA  TRUE FALSE FALSE FALSE FALSE FALSE    NA
[8737] FALSE    NA FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE
[8749]  TRUE FALSE  TRUE FALSE FALSE

以下是testdata的最后一行[b,c(&#34; SEQN&#34;,&#34; cotpos1&#34;)]:

8711   41422       1
NA.986    NA      NA
NA.987    NA      NA
8722   41437       1
8725   41440       1
NA.988    NA      NA
NA.989    NA      NA
8730   41447       1
NA.990    NA      NA
NA.991    NA      NA
8742   41461       1
8748   41468       1
8749   41469       1
8751   41472       1

奇怪的NAs出现在b不是NA的地方

最终编辑: BondedDust的回复是正确的。当我说b和奇怪的NAs不匹配时(上图),我没有说明[]没有打印对应于FALSE的行这一事实。一旦你把这些愚蠢的东西拿出来,它们就会完美匹配。

1 个答案:

答案 0 :(得分:0)

如果您查看testdata $ cotpos2的值,您会看到:

> table( testdata$cotpos2==1, useNA="always")

FALSE  TRUE  <NA> 
 6346  1415   992 

阅读“[”功能的帮助页面。它阅读大约10次。当给定NA值时,您应该找到描述“[”行为的部分。当理解其规则和细微之处是R中有效数据管理的关键时(我会根据NA值的处理设计不同的方法。)