2013-10-13 4 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

Brilliant! Спасибо за быстрый ответ! – Samir

Смежные вопросы