2013-10-13 5 views
1

가정하자 나는 데이터 프레임을 구성 :선택 행

> 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 AND하지 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