子集删除 df$var=0 的行产生 NA 行,其中 var 是 NA
Subsetting to drop rows where df$var=0 produces NA rows where var is NA
我有一个 data.frame,我正试图消除对它的一些观察。我想删除 out$SUB_AGE
等于 0
的任何行。但是,当我尝试根据该条件对我的 df 进行子集化时,它将 out$SUB_AGE
的 NA
的任何行转换为 NA
的一行。我在下面提供了一个 dput,它实际上不包含 out$SUB_AGE=0
的任何行,但它的行为与包含零的完整数据集完全相同。
# dput the data
> temp <- dput(droplevels(out[1:12, 1:4]))
structure(list(SUB_ID = c(5998784L, 6805295L, 318926L, 1270965L,
1635543L, 4296301L, 1001498L, 2388387L, 2190957L, 4168048L, 318926L,
4073180L), ORG_ID = c(10861L, 17361L, 10608L, 11099L, 13135L,
14803L, 12359L, 13151L, 13135L, 17252L, 10608L, 17317L), SUB_AGE = c(36,
NA, NA, 40, 60, 50, 52, 61, 56, 62, NA, NA), SUB_SEX = c(NA,
1, 2, 1, 2, 2, 1, 2, 2, NA, 2, 2)), .Names = c("SUB_ID", "ORG_ID",
"SUB_AGE", "SUB_SEX"), row.names = c(107L, 190L, 242L, 331L,
361L, 447L, 455L, 591L, 663L, 664L, 731L, 732L), class = "data.frame")
# table before subsetting
SUB_ID ORG_ID SUB_AGE SUB_SEX
107 5998784 10861 36 NA
190 6805295 17361 NA 1
242 318926 10608 NA 2
331 1270965 11099 40 1
361 1635543 13135 60 2
447 4296301 14803 50 2
455 1001498 12359 52 1
591 2388387 13151 61 2
663 2190957 13135 56 2
664 4168048 17252 62 NA
731 318926 10608 NA 2
732 4073180 17317 NA 2
# code to subset
temp <- temp[temp$SUB_AGE != 0,]
# table after subsetting
SUB_ID ORG_ID SUB_AGE SUB_SEX
107 5998784 10861 36 NA
NA NA NA NA NA
NA.1 NA NA NA NA
331 1270965 11099 40 1
361 1635543 13135 60 2
447 4296301 14803 50 2
455 1001498 12359 52 1
591 2388387 13151 61 2
663 2190957 13135 56 2
664 4168048 17252 62 NA
NA.2 NA NA NA NA
NA.3 NA NA NA NA
我确定这里遗漏了一些简单的东西,但我绞尽脑汁显然无法想出正确的关键字组合来自己解决。
要了解问题,请尝试打印 temp$SUB_AGE != 0
:
[1] TRUE NA NA TRUE TRUE TRUE TRUE TRUE TRUE TRUE NA NA
您正在使用此向量对 temp
进行子集化,但该功能仅适用于 TRUE/FALSE 值。如果你想保留所有具有 NA 值的行,你可以添加一个额外的条件:
temp[temp$SUB_AGE != 0 | is.na(temp$SUB_AGE),]
我有一个 data.frame,我正试图消除对它的一些观察。我想删除 out$SUB_AGE
等于 0
的任何行。但是,当我尝试根据该条件对我的 df 进行子集化时,它将 out$SUB_AGE
的 NA
的任何行转换为 NA
的一行。我在下面提供了一个 dput,它实际上不包含 out$SUB_AGE=0
的任何行,但它的行为与包含零的完整数据集完全相同。
# dput the data
> temp <- dput(droplevels(out[1:12, 1:4]))
structure(list(SUB_ID = c(5998784L, 6805295L, 318926L, 1270965L,
1635543L, 4296301L, 1001498L, 2388387L, 2190957L, 4168048L, 318926L,
4073180L), ORG_ID = c(10861L, 17361L, 10608L, 11099L, 13135L,
14803L, 12359L, 13151L, 13135L, 17252L, 10608L, 17317L), SUB_AGE = c(36,
NA, NA, 40, 60, 50, 52, 61, 56, 62, NA, NA), SUB_SEX = c(NA,
1, 2, 1, 2, 2, 1, 2, 2, NA, 2, 2)), .Names = c("SUB_ID", "ORG_ID",
"SUB_AGE", "SUB_SEX"), row.names = c(107L, 190L, 242L, 331L,
361L, 447L, 455L, 591L, 663L, 664L, 731L, 732L), class = "data.frame")
# table before subsetting
SUB_ID ORG_ID SUB_AGE SUB_SEX
107 5998784 10861 36 NA
190 6805295 17361 NA 1
242 318926 10608 NA 2
331 1270965 11099 40 1
361 1635543 13135 60 2
447 4296301 14803 50 2
455 1001498 12359 52 1
591 2388387 13151 61 2
663 2190957 13135 56 2
664 4168048 17252 62 NA
731 318926 10608 NA 2
732 4073180 17317 NA 2
# code to subset
temp <- temp[temp$SUB_AGE != 0,]
# table after subsetting
SUB_ID ORG_ID SUB_AGE SUB_SEX
107 5998784 10861 36 NA
NA NA NA NA NA
NA.1 NA NA NA NA
331 1270965 11099 40 1
361 1635543 13135 60 2
447 4296301 14803 50 2
455 1001498 12359 52 1
591 2388387 13151 61 2
663 2190957 13135 56 2
664 4168048 17252 62 NA
NA.2 NA NA NA NA
NA.3 NA NA NA NA
我确定这里遗漏了一些简单的东西,但我绞尽脑汁显然无法想出正确的关键字组合来自己解决。
要了解问题,请尝试打印 temp$SUB_AGE != 0
:
[1] TRUE NA NA TRUE TRUE TRUE TRUE TRUE TRUE TRUE NA NA
您正在使用此向量对 temp
进行子集化,但该功能仅适用于 TRUE/FALSE 值。如果你想保留所有具有 NA 值的行,你可以添加一个额外的条件:
temp[temp$SUB_AGE != 0 | is.na(temp$SUB_AGE),]