2013-05-29 14 views
21

Tutaj jest wektoremR: Radzenie sobie z true, false, Na i NaN

a = c(T,F,F,NA,F,T,NA,F,T) 

Chciałbym prostą funkcję, która zwraca wartość true, za każdym razem jest TRUE w a Fałsz i za każdym razem jest fałsz lub NA w a.

3 następujące rzeczy nie działają

a == T 
identical(T,a) 
isTRUE(a) 

Oto rozwiązanie

a[-which(is.na(a))] 

ale nie wydaje się być straigth naprzód i łatwe rozwiązanie

Czy istnieje inne rozwiązanie ?

Oto niektóre funkcje (i operatorzy) Wiem:

identical() 
isTRUE() 
is.na() 
na.rm() 
& 
| 
! 

Jakie są inne funkcje (operatorzy, porady, cokolwiek ...), które są przydatne do czynienia z PRAWDA, FAŁSZ, NA, NaN?

i wreszcie ...

Jakie są różnice pomiędzy NA a NaN?

Czy są inne "logiczne rzeczy" niż T, F, NA i NaN?

Wielkie dzięki!

+4

Aby odpowiedzieć na to pierwsze pytanie, tutaj jest jeden sposób: 'Wektoryzacja (isTRUE) (a)'. –

+1

bardziej wąsko, myślę, że '! Is.na (x) & x' powinno działać, o ile wartości, których się spodziewasz, są definitywnie zawarte w {' TRUE', 'FALSE',' NA', 'NaN'} ... –

+0

Ładne rozwiązania! –

Odpowiedz

8

Aby odpowiedzieć na pytania w kolejności:

1) Operator == nie rzeczywiście traktują NA użytkownika, jak można oczekiwać, że. Bardzo użyteczną funkcją jest funkcja ta compareNA z r-cookbook.com:

compareNA <- function(v1,v2) { 
    # This function returns TRUE wherever elements are the same, including NA's, 
    # and false everywhere else. 
    same <- (v1 == v2) | (is.na(v1) & is.na(v2)) 
    same[is.na(same)] <- FALSE 
    return(same) 
    } 

2) NA oznacza "Niedostępne", i nie jest taki sam jak ogólny NaN ("Not a Number"). NA jest na ogół używane dla wartości domyślnej dla liczby, która ma zastąpić brakujące dane; NaN są zwykle generowane, ponieważ numeryczny problem (biorąc log z -1 lub podobne).

3) Nie jestem do końca pewien, co rozumiesz przez "rzeczy logiczne" - wiele różnych typów danych, w tym wektorów liczbowych, może być użytych jako dane wejściowe dla operatorów logicznych. Możesz spróbować odczytać stronę operatorów logicznych R: http://stat.ethz.ch/R-manual/R-patched/library/base/html/Logic.html.

Mam nadzieję, że to pomoże!

+0

Dzielenie przez 0 to 'Inf', ale' Inf - Inf' daje ci 'NaN'. Wiele razy funkcje R zgłoszą wyjątek, jeśli wygenerowane zostaną 'NaN ', np.' Log (-1) '. –

+0

@Matthew: Dzięki - poprawione. – ben

6

Więc chcesz TRUE pozostanie prawdą i fałszem pozostać FAŁSZ, jedyna prawdziwa zmiana jest taka, że ​​NA musi stać FAŁSZ, więc po prostu zrobić tej zmiany jak:

a[ is.na(a) ] <- FALSE 

Albo można przeformułować to powiedzieć to prawda, jeśli prawdą jest, i nie brakuje:

a <- a & !is.na(a) 
6

Biorąc za sugestię Ben Bolker powyżej można ustawić własną funkcję w następstwie is.na() składnia

is.true <- function(x) { 
    !is.na(x) & x 
} 

a = c(T,F,F,NA,F,T,NA,F,T) 

is.true(a) 
[1] TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE 

Działa to również w przypadku danych podzestawów.

b = c(1:9) 
df <- as.data.frame(cbind(a,b)) 

df[is.true(df$a),] 

    a b 
1 1 1 
6 1 6 
9 1 9 

Pomaga także uniknąć przypadkowego wprowadzenia pustych wierszy, w których istnieją dane NA.

df[df$a == TRUE,] 

     a b 
1  1 1 
NA NA NA 
6  1 6 
NA.1 NA NA 
9  1 9 
+0

naprawdę nie potrzebujesz 'ifelse()' tutaj - jak @ GregSnow wskazuje na odpowiedź, '! Is.na (x) & x' jest równoważne –

+0

@BenBolker - Dzięki, poprawione zgodnie z sugestią. – JWilliman

37

Nie trzeba zawinąć coś w funkcji - następujące prace

a = c(T,F,NA) 

a %in% TRUE 

[1] TRUE FALSE FALSE 
+5

Ładne rozwiązanie. Możesz go użyć w formie funkcjonalnej: ''% in% '(aamc $ forgive, FALSE) 'co jest użyteczne w' apply' i jego ilk. –

4

lubię is.element funkcji:

is.element(a, T)