为什么在对具有适合维度且没有NA的情况下对data.frame进行子集化时会创建NA?

时间:2016-12-06 14:53:38

标签: r

我用过的项目中没有NA值用于通过基本的R索引对这些data.frame进行子集化,但在我的结果中几乎有一半变为NA。尺寸是一致的,我检查了匹配的每一部分,以确保它是孤立的。

对数据进行采样,以便我可以使用dput()不可行,因为它会破坏匹配,因此我将.RDS数据上传到GitHub:

https://github.com/hack-r/stackoverflow_NA_question

要从GitHub下载文件,您可以克隆回购或单击该文件,然后单击"下载"按钮。要克隆仓库类型git clone https://github.com/hack-r/stackoverflow_NA_question.git

model_data            <- readRDS("model_data.RDS")
StartDates.next3.prev <- readRDS("startDates.next3.prev.RDS")
pred                  <- readRDS("pred.RDS")

table(is.na(pred))
# FALSE 
# 156930

table(is.na(model_data$flag_prev))
# FALSE 
# 52716

nrow(pred) == length(model_data$flag_prev[model_data$flag_prev=="Y"])
# [1] TRUE

StartDates.next3.prev$Start_Date[1]
# [1] "2016-01-04"

table(model_data$matched_start_date[model_data$flag_prev=="Y"]==startDates.next3.prev$Start_Date[1])
# FALSE  TRUE 
# 21872  9514 


tmp <- pred$Enroll.in.term.1[model_data$flag_prev == "Y" &
                             model_data$matched_start_date ==
                             StartDates.next3.prev$Start_Date[1]]

table(is.na(tmp)) # Why are 4,130 NA??
# FALSE  TRUE 
# 5384  4130

应该有9,514个结果,但是它们都应该是非NA。

1 个答案:

答案 0 :(得分:1)

length(pred$Enroll.in.term.1)
# 31386

x <- model_data$flag_prev == "Y"
y <- model_data$matched_start_date ==  StartDates.next3.prev$Start_Date[1]

sum(which((x & y) == T) > 31386)
# 4130

问题是model_data的行数多于pred。因此,您用于子集的逻辑向量比pred长得多。因此,将有4130个NAs。