2016-06-20 15 views
1

Ich habe einen Datensatz mit zwei Spalten, die ich zu einer einzigen Spalte kombinieren möchte, mit dplyr rowwise mutate und einer benutzerdefinierten Funktion. Seltsamerweise für die zweite Reihe, die einem bestimmten Muster entspricht (aber nicht das erste oder nachfolgende), bekomme ich NA als Rückgabewert. Unten ist ein Beispiel:dplyr reihenweise mutieren mit benutzerdefinierter Funktion gibt unerwartetes NA zurück

my.func <- function(alpha, beta) { 
    if(!is.na(beta) & beta) { 
    return("c") 
    } else if(is.na(alpha)) { 
    return(as.character(NA)) 
    } else if (alpha == "a") { 
    return("a") 
    } else if (alpha == "b") { 
    return("b") 
    } else { 
    return(as.character(NA)) 
    } 
} 

tmp <- data.frame(obs = 1:7, 
        dt = c('2016-03-15 17:35:46','2016-03-15 18:45:47','2016-03-15 19:22:17','2016-03-15 19:23:45','2016-03-15 20:21:55','2016-03-15 21:20:10','2016-03-15 22:18:34'), 
        one = c(NA,"a","a","a","b","a","b"), two = c(NA,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE)) 

tmp2 <- tmp %>% rowwise() %>% mutate(three = my.func(one, two)) 

Dies führt zu einem NA in Reihe drei, Spalte drei, wenn für die Zeile oben, mit dem exakt gleichen Eingang, es in „a“ geführt.

+0

Haben Sie die dritte gedruckte Zeile oder die Zeile mit einem rowName von „3“ gemeint ? Die Zeile mit dem Rowname "1" ist der einzige NA-Wert, wenn ich ihn ausführe und das völlig erwartet. (Und ich denke, Sie beziehen sich auf Spalte 5.) Zeit für eine Versionsüberprüfung? –

+0

Ich habe dplyr Version 0.4.3.9001 –

+0

Ich bin wirklich verwirrt darüber. 'mapply (my.func, tmp $ eins, tmp $ two)' liefert das korrekte Ergebnis. Und wenn Sie die erste "NA" ändern, wird es auch richtig ... Vielleicht hat es etwas mit "rowwise()" zu tun. – Alex

Antwort

-1

ich nicht genau verstehen, warum Ihr Code nicht funktioniert, aber das scheint folgendes zu tun, was Sie erwarten:

tmp2 <- tmp %>% mutate(three = mapply(my.func, one, two)) 

>tmp2 

    obs     dt one two three 
1 1 2016-03-15 17:35:46 <NA> NA <NA> 
2 2 2016-03-15 18:45:47 a FALSE  a 
3 3 2016-03-15 19:22:17 a FALSE  a 
4 4 2016-03-15 19:23:45 a FALSE  a 
5 5 2016-03-15 20:21:55 b FALSE  b 
6 6 2016-03-15 21:20:10 a TRUE  c 
7 7 2016-03-15 22:18:34 b FALSE  b 
Verwandte Themen