从R数据框中选择行

时间:2013-10-13 19:21:03

标签: r dataframe

假设我在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>

对此有更优雅的解决方案吗?

提前致谢。

1 个答案:

答案 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