1

假设我在 R 版本 3.0.2 中构造如下数据框:

> name <- c("Bob", "Mary", "John", "Sue", "Paul", "Jane", "Steve")
> age <- c(32, NA, NA, 27, 40, 50, 10)
> sex <- c("M", "F", "M", "F", NA, "F", "M")
> city <- c("New York", "London", "Sao Paulo", "Mumbai", "Sydney", NA, "Beijing")
> census <- data.frame(name, age, sex, city)
> census
   name age  sex      city
1   Bob  32    M  New York
2  Mary  NA    F    London
3  John  NA    M Sao Paulo
4   Sue  27    F    Mumbai
5  Paul  40 <NA>    Sydney
6  Jane  50    F      <NA>
7 Steve  10    M   Beijing

我想提取“年龄”大于 30 而不是 NA 的所有行。其他列是否有 NA 无关紧要。如果我尝试

> na.omit(census[c(census$age>30),])

我得到以下信息:

  name age sex     city
1  Bob  32   M New York

但是,这也省略了我也想返回的 Paul 和 Jane 的行。我能看到这样做的唯一方法如下:

> foo <- complete.cases(census$age)
> bar <- census[foo, ]
> bar[c(bar$age > 30), ]
  name age  sex     city
1  Bob  32    M New York
5 Paul  40 <NA>   Sydney
6 Jane  50    F     <NA>

有没有更优雅的解决方案?

提前致谢。

4

1 回答 1

0

如何is.na结合使用您的数字条件:

census[census$age > 30 & !is.na(census$age), ]
#   name age  sex     city
# 1  Bob  32    M New York
# 5 Paul  40 <NA>   Sydney
# 6 Jane  50    F     <NA>

!当然,是not


也就是说,我认为您当前的解决方案没有太大问题。


对于“优雅”(我认为这是一个主观的术语),请查看“data.table”包:

library(data.table)
DT <- data.table(census)
DT[age > 30]
#    name age sex     city
# 1:  Bob  32   M New York
# 2: Paul  40  NA   Sydney
# 3: Jane  50   F       NA
于 2013-10-13T19:26:50.867 回答