2013-10-13 98 views
1

假设我构造的数据帧中的R版本3.0.2如下:从R数据帧选择行

> 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 

然而,这也省略了保罗和简行,我也想回来。我能看到这样做的唯一方法如下:

> 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

什么利用的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 
+0

辉煌!感谢您及时的回复! – Samir