假设我在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>
对此有更优雅的解决方案吗?
提前致谢。
答案 0 :(得分: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
。
尽管如此,我认为您当前的解决方案并没有太多问题。
对于“优雅”(术语I find subjective),请查看“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