【问题标题】:Subsetting to drop rows where df$var=0 produces NA rows where var is NA删除 df$var=0 的行的子集生成 var 为 NA 的 NA 行
【发布时间】:2018-05-25 10:55:12
【问题描述】:

我有一个 data.frame,我正试图消除一些观察结果。我想删除out$SUB_AGE 等于0 的任何行。但是,当我尝试根据该条件对我的 df 进行子集化时,它会将具有NA for out$SUB_AGE 的任何行转换为NAs 的行。我在下面提供了一个 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

我确定我在这里遗漏了一些简单的东西,但我绞尽脑汁,显然无法想出正确的关键字组合来自己弄清楚。

【问题讨论】:

  • 我以subset(temp, temp$SUB_AGE != 0) 运行它,它所做的一切与上面相同,但删除了那些 NA 行。
  • 不,我想保留SUB_AGE 的任何值不为零的行,包括NA。错误是它正在创建 all-NA 行。此外,在有和没有temp$ 的情况下运行它并得到相同的结果。这是我的一个愚蠢的错字。

标签: r subset na


【解决方案1】:

要了解问题,请尝试打印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),]

【讨论】:

  • 这成功了,谢谢。我认为这是一个笨拙的解决方法,但它有效,所以我很满意!也感谢您的解释。
猜你喜欢
  • 2015-08-28
  • 2021-11-30
  • 1970-01-01
  • 2017-05-04
  • 2021-03-24
  • 1970-01-01
  • 2022-06-13
  • 1970-01-01
  • 2016-07-10
相关资源
最近更新 更多