2014-12-27 9 views
29

Datentypen zu ändern, die ich so etwas wiedplyr viele Arten Daten ändern

l1 <- c("fac1","fac2","fac3") 
l2 <- c("dbl1","dbl2","dbl3") 
dat[,l1] <- lapply(dat[,l1], factor) 
dat[,l2] <- lapply(dat[,l2], as.numeric) 

mit dplyr

dat <- dat %>% mutate(
    fac1 = factor(fac1), fac2 = factor(fac2), fac3 = factor(fac3), 
    dbl1 = as.numeric(dbl1), dbl2 = as.numeric(dbl2), dbl3 = as.numeric(dbl3) 
) 

eine elegantere (kürzere) Art und Weise in dplyr ist es nicht verwenden kann?

thx Christof

Antwort

33

Sie die Standard-Testversion von mutate_each verwenden können (die mutate_each_ ist) die Spaltenklassen zu ändern:

dat %>% mutate_each_(funs(factor), l1) %>% mutate_each_(funs(as.numeric), l2) 
+6

In diesem Fall 'starts_with()' – hadley

+2

Vielen Dank für Ihre Anregung Sie auch, @hadley nutzen könnten. Für den ersten Fall wäre das also dat%>% mutate_each (funs (Faktor), starts_with ("fac")), um alle Spalten, die mit der Zeichenkette "fac" beginnen, in factor zu konvertieren. –

+0

@docendodiscimus das ist richtig – hadley

21

Von der Unterseite des ?mutate_each (zumindest in dplyr 0,5) Es sieht wie diese Funktion aus, wie in @docendo discimus's Antwort, wird veraltet und durch flexiblere Alternativen mutate_if, mutate_all und mutate_at ersetzt. Der am ähnlichste zu dem, was @hadley in seinem Kommentar erwähnt, ist wahrscheinlich mutate_at. Beachten Sie, dass die Reihenfolge der Argumente umgekehrt ist, verglichen mit mutate_each, und vars() verwendet select() wie Semantik, die ich interpretiere, um die ?select_helpers Funktionen zu bedeuten.

dat %>% mutate_at(vars(starts_with("fac")),funs(factor)) %>% 
    mutate_at(vars(starts_with("dbl")),funs(as.numeric)) 

Aber mutate_at können Spaltennummern anstelle eines vars() Argument nehmen und nach durch diese Seite zu lesen, und die Alternativen suchen, landete ich mit mutate_at, aber mit grep auf einmal viele verschiedene Arten von Spaltennamen zu erfassen (es sei denn, Sie immer so offensichtlich Spaltennamen haben!)

dat %>% mutate_at(grep("^(fac|fctr|fckr)",colnames(.)),funs(factor)) %>% 
    mutate_at(grep("^(dbl|num|qty)",colnames(.)),funs(as.numeric)) 

ich ziemlich aufgeregt war, um aus Bezifferung mutate_at + grep, weil jetzt eine Zeile auf viel arbeiten kann von Säulen.

BEARBEITEN - jetzt sehe ich matches() in der select_helpers, die Regex behandelt, so jetzt gefällt mir das.

dat %>% mutate_at(vars(matches("fac|fctr|fckr")),funs(factor)) %>% 
    mutate_at(vars(matches("dbl|num|qty")),funs(as.numeric)) 

Ein weiterer allgemein bezogenen Kommentar - wenn Sie alle Ihre Datumsspalten mit anpassungsfähigen Namen haben, und einheitliche Formate, das ist mächtig. In meinem Fall werden dadurch alle meine YYYYMMDD-Spalten, die als Zahlen gelesen wurden, in Daten umgewandelt.

mutate_at(vars(matches("_DT$")),funs(as.Date(as.character(.),format="%Y%m%d"))) 
3

Eine allgemeinere Art und Weise Spaltenart Transformation zu erreichen, ist wie folgt:

Wenn Sie alle Ihre Faktor Spalten Zeichen Spalten zu transformieren möchten, zum Beispiel, kann dieses ein Rohr durchgeführt werden unter Verwendung von :

df %>% mutate_each_(funs(as.character(.)), names(.[,sapply(., is.factor)])) 
+12

für diesen Fall,' df%>% mutate_if (is.factor, as.character) 'funktioniert (für Version von dplyr> 0.5) –

Verwandte Themen