2014-12-27 21 views
29

zmienić typy danych można użyć coś takiegodplyr zmienić wiele typów danych

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

z 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) 
) 

jest bardziej eleganckim (krótszy) sposób, w dplyr?

thx Christof

Odpowiedz

33

Można użyć standardowej wersji testowej mutate_each (co jest mutate_each_), aby zmienić klasy kolumna:

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

W tym przypadku można również użyć 'starts_with()' – hadley

+2

Dzięki za sugestię, @hadley. Tak więc dla pierwszego przypadku, który byłby 'dat%>% mutate_each (funs (factor), starts_with (" fac "))', aby przekonwertować wszystkie kolumny zaczynając od ciągu "fac" do czynnika. –

+0

@docendodiscimus ma rację: – hadley

21

Od dołu (przynajmniej ?mutate_each w dplyr 0,5) wygląda na to, że ta funkcja, jak w odpowiedzi @docendo discimus, zostanie uznana za przestarzałą i zastąpiona bardziej elastycznymi alternatywami: mutate_if, mutate_all i mutate_at. Ten, który jest najbardziej podobny do tego, co wspomina @hadley w swoim komentarzu, prawdopodobnie używa numeru mutate_at. Zauważ, że kolejność argumentów jest odwrotna, w porównaniu do mutate_each, a vars() używa select() jak semantyki, co interpretuję jako funkcje ?select_helpers.

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

Ale mutate_at mogą numery kolumn zamiast do vars() argumentu, a po przeczytaniu tej stronie i patrząc na alternatyw, skończyło się za pomocą mutate_at ale z grep uchwycić wiele różnych rodzajów nazw kolumn naraz (chyba, że ​​masz zawsze takie oczywiste nazwy kolumn!)

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

byłem bardzo podekscytowany zastanawianie się mutate_at + grep, bo teraz jedna linia może pracować na z dużą kolumny.

EDYCJA - teraz widzę matches() wśród select_helpers, który obsługuje regex, więc teraz lubię to.

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

Inny ogólnie związany komentarz - jeśli posiadasz wszystkie kolumny z odpowiednimi nazwami i spójnymi formatami, jest to potężne. W moim przypadku zmienia to wszystkie moje kolumny YYYYMMDD, które zostały odczytane jako liczby, w datach.

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

Bardziej ogólnie sposobem osiągnięcia transformacji typu kolumna przedstawia się następująco:

Jeśli chcesz, aby przekształcić wszystkie czynnik kolumn do charakter kolumnach, np, można to zrobić za pomocą jednej rury :

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

dla tego przypadku, 'df%>% mutate_if (is.factor, as.character)' działa (dla wersji dplyr> 0.5) –