2016-04-25 8 views
3

Zum Beispiel habe ich in einer data.table drei Spalten. Ich möchte jede Zeile basierend auf dem Zustand einer einzelnen Spalte ändern.Anwenden der Bedingung auf die ganze Zeile mit dplyr

Geschrieben mit allen Variablen In diesem Beispiel, wenn die Spalte a == 4, alle Spalten dieser Zeile werden durch 4 multipliziert dies würde wie folgt aussehen:

a <- c(1,2,3,4,5) 
b <- c(2,4,6,7,8) 
c <- c(3,6,9,0,3) 

data.frame(a,b,c) %>% rowwise() %>% mutate(a=ifelse(a==4,a*4,a), 
              b=ifelse(a==4,b*4,b), 
              c=ifelse(a==4,c*4,c)) 

Gibt es eine Möglichkeit, einfach die setzen Bedingung in einer Zeile, ohne jede Spalte zu schreiben? Ich würde so etwas wie dies vorstellen:

data.frame(a,b,c) %>% rowwise() %>% mutate(.=ifelse(a==4,.*4,.)) 
+2

Warum dplyr? 'df [df $ a == 4,] <- df [df $ a == 4,] * 4' – zx8754

+0

Es ist komplizierter als das Beispiel. Dies wäre im Vergleich zu einer dplyr-Lösung sehr langsam, oder? – Sebastian

+1

Bitte versuchen Sie ein "kompliziertes" Beispiel anzugeben. – zx8754

Antwort

3

Dies ist, was für mutate_each entwickelt wurde, aber aus irgendeinem Grund alle dplyr Lösungen geben nicht die richtige Antwort für Zelle [4, 'b'].

a <- c(1,2,3,4,5) 
b <- c(2,4,6,7,8) 
c <- c(3,6,9,0,3) 

A <- data.frame(a,b,c) %>% rowwise() %>% mutate(a=ifelse(a==4,a*4,a), 
               b=ifelse(a==4,b*4,b), 
               c=ifelse(a==4,c*4,c)) 
B <- data.frame(a,b,c) %>% mutate(a=ifelse(a==4,a*4,a), 
            b=ifelse(a==4,b*4,b), 
            c=ifelse(a==4,c*4,c)) 

C <- data.frame(a,b,c) %>% 
    mutate_each(funs(ifelse(a == 4, . * 4, .))) 

D <- data.frame(a,b,c) %>% 
    rowwise() %>% 
    mutate_each(funs(ifelse(a == 4, . * 4, .))) 

E <- data.frame(a,b,c) 
E[E$a == 4, ] <- E[E$a == 4, ] * 4 

all.equal(A, B) 
#TRUE 
all.equal(A, C) 
#TRUE 
all.equal(A, D) 
#TRUE 
all.equal(A, E) 
#FALSE 

Der Basiscode von zx8754 ist die einzige, mit der richtigen Antwort, in den anderen nur a von 4. multipliziert wird ich nicht ganz verstehen, warum.

Es kann ein Fehler (?) Sein. Vielleicht möchten Sie file an issue on Github.

+1

Soweit ich sehen kann, werden nicht alle Spalten von Zeilen mit a == 4 mit 4 multipliziert, nur Spalte a. –

+0

Hmmm, du hast Recht. Ich habe meine Ausgabe mit der langen Version im OP verglichen. Wird bearbeiten .... – Axeman

-1

Sie zx8754-Lösung kombinieren mit dplyr durch eine eigene Funktion machen:

multiply.if <- function(x){ 
    x[x$a == 4, ] <- x[x$a == 4, ] * 4 
    return(x) 
} 

data.frame(a,b,c) %>% multiply.if() 

Wenn das Problem komplizierter ist, können Sie die Funktion verallgemeinern, das heißt:

+0

Während dies eine Pipe verwendet, wird 'dplyr' nicht wirklich verwendet. – Axeman

+1

Sie haben Recht, ich habe die Waffe dort gesprungen. Ich bin neu hier, also weiß ich nicht, ob ich meine Antwort löschen oder lassen sollte. – Fridriksson

Verwandte Themen