2011-06-27 9 views
5

Używam R i szukałem odpowiedzi, ale chociaż widziałem podobne pytania, to nie zadziałało dla mojego konkretnego problemu.Zignoruj ​​NA w funkcji sapply

W moim zestawie danych próbuję użyć znaków NA jako symboli zastępczych, ponieważ zamierzam do nich wrócić po tym, jak otrzymam część mojej analizy, dlatego też chciałbym móc wykonać wszystkie moje obliczenia jako jeśli NA naprawdę tam nie było.

Oto mój problem z tabeli przykładowe dane

ROCA = c(1,3,6,2,1,NA,2,NA,1,NA,4,NA) 
ROCA <- data.frame (ROCA=ROCA)  # converting it just because that is the format of my original data 

#Now my function 
exceedes <- function (L=NULL, R=NULL, na.rm = T) 
{ 
    if (is.null(L) | is.null(R)) { 
     print ("mycols: invalid L,R.") 
     return (NULL)    
    } 
    test <-(mean(L, na.rm=TRUE)-R*sd(L,na.rm=TRUE)) 
    test1 <- sapply(L,function(x) if((x)> test){1} else {0}) 
    return (test1) 
} 
L=ROCA[,1] 
R=.5 
ROCA$newcolumn <- exceedes(L,R) 
names(ROCA)[names(ROCA)=="newcolumn"]="Exceedes1" 

otrzymuję błąd:

Error in if ((x) > test) { : missing value where TRUE/FALSE needed 

Jak znacie, to jest coś nie tak z funkcji sapply. Wszelkie pomysły na ignorowanie tych NA? Chciałbym spróbować na.omit, gdybym mógł go wstawić, aby wstawić wszystkie NA w miejscu, w którym były wcześniej, ale nie jestem pewien, jak to zrobić.

+0

Dlaczego po prostu nie dodajemy innego polecenia if do funkcji sapply, która zwraca NA, jeśli x jest NA? Ponadto, jeśli umieścisz 'browser()' w dowolnym miejscu w twojej funkcji, zatrzyma się ono w tym miejscu, kiedy uruchomisz je następnym razem. –

+0

Dzięki za odpowiedź! Nie jestem pewien, czy zrobiłem to prawo, ponieważ wciąż mam ten sam błąd. Oto mój kod test1 <- sapply (L, function (x) if ((x) == NA) {NA} else if ((x)> test) {1} else {0} ) i błąd jest teraz: Błąd w if ((x) == NA) {: brakująca wartość, gdy potrzebne jest PRAWDA/FAŁSZ – Tim

+0

Musisz użyć 'is.na (x)', aby to sprawdzić. 'x == NA' zwraca NA ... – Tommy

Odpowiedz

3

Stwierdzenie to jest dziwne:

test1 <- sapply(L,function(x) if((x)> test){1} else {0}) 

Spróbuj:

test1 <- ifelse(is.na(L), NA, ifelse(L > test, 1, 0)) 
+0

Nie mogę ci wystarczająco podziękować. Naprawdę doceniam szybką informację zwrotną! – Tim

+0

Nie jestem pewien, czy należy ponownie zadać osobne, ale pokrewne pytanie. Dzięki pomocy wszystkich chciałem dokonać drobnego poprawki. Niektóre części moich danych mają puste pola, chcę określić, że jeśli dwie kolumny mają puste pola, to kolumny od 5 do 10 będą miały wartość NA. Kod, którego próbowałem użyć, jest właśnie taki. Na pewno muszę przejrzeć moje instrukcje if. a <- if (a [, 10] i a [, 11] == "" is.na (a [, 5: 10]) Wystąpił błąd: nieoczekiwany symbol w "a <- if (a [, 10] & a [, 11] == "" is.na " – Tim

+0

" if "jest strukturą kontrolną. Prawdopodobnie chcesz" ifelse ", który zwraca wektor. –

2

Chcesz NA: S w wyniku? To znaczy, czy wiersze mają się składać?

wydaje się po prostu powracać L > test będzie działać wtedy. Dodanie kolumny również może być uproszczone (podejrzewam, że "Exeedes1" jest gdzieś w zmiennej).

exceedes <- function (L=NULL, R=NULL, na.rm = T) 
{ 
    if (is.null(L) | is.null(R)) { 
     print ("mycols: invalid L,R.") 
     return (NULL)    
    } 
    test <-(mean(L, na.rm=TRUE)-R*sd(L,na.rm=TRUE)) 

    L > test 
} 
L=ROCA[,1] 
R=.5 
ROCA[["Exceedes1"]] <- exceedes(L,R) 
5

Nie ma potrzeby sapply a ponieważ > anonimowa funkcja jest już wektorowy.

Również wydaje się dziwne określenie domyślnych wartości argumentów, które są nieprawidłowe. Domyślam się, że używasz tego jako kludge zamiast używać funkcji missing. Dobrą praktyką jest także zgłaszanie błędu, zamiast zwracania NULL, ponieważ nadal trzeba będzie próbować złapać, gdy funkcja zwróci NULL.

exceedes <- function (L, R, na.rm=TRUE) 
{ 
    if(missing(L) || missing(R)) { 
    stop("L and R must be provided") 
    } 
    test <- mean(L,na.rm=TRUE)-R*sd(L,na.rm=TRUE) 
    as.numeric(L > test) 
} 

ROCA <- data.frame(ROCA=c(1,3,6,2,1,NA,2,NA,1,NA,4,NA)) 
ROCA$Exceeds1 <- exceedes(ROCA[,1],0.5) 
+0

Zaletą używania null jest to, że zawsze łatwo jest jawnie przekazać. W niektórych sytuacjach generowanie "brakujących" argumentów jest uciążliwe. – hadley

+0

@hadley: Zgadzam się (w ten sposób 'plot.default' obsługuje kilka argumentów), ale miałem na myśli tę konkretną sytuację, w której wartości argumentów" NULL "są nieprawidłowe. –

Powiązane problemy