2014-12-27 24 views
29

để thay đổi các kiểu dữ liệu tôi có thể sử dụng giống nhưdplyr thay đổi nhiều kiểu dữ liệu

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

với 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) 
) 

là có một (ngắn hơn) cách thanh lịch hơn trong dplyr?

thx Christof

Trả lời

33

Bạn có thể sử dụng phiên bản đánh giá tiêu chuẩn của mutate_each (đó là mutate_each_) để thay đổi các lớp cột:

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

Trong trường hợp này, bạn cũng có thể sử dụng 'starts_with()' – hadley

+2

Cảm ơn đề xuất của bạn, @hadley. Vì vậy, đối với trường hợp đầu tiên sẽ là 'dat%>% mutate_each (funs (factor), starts_with (" fac "))' để chuyển đổi tất cả các cột bắt đầu bằng chuỗi "fac" thành thừa số. –

+0

@docendodiscimus đúng là – hadley

21

Từ đáy của ?mutate_each (ít nhất là trong dplyr 0,5) có vẻ như chức năng đó, như trong câu trả lời của @docendo discimus, sẽ không được dùng nữa và được thay thế bằng các giải pháp thay thế linh hoạt hơn mutate_if, mutate_allmutate_at. Cái tương tự nhất với những gì @hadley đề cập trong nhận xét của anh ấy có lẽ là sử dụng mutate_at. Lưu ý thứ tự của các đối số được đảo ngược, so với mutate_eachvars() sử dụng select() như ngữ nghĩa, mà tôi hiểu là hàm ?select_helpers.

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

Nhưng mutate_at có thể mất số cột thay vì một cuộc tranh luận vars(), và sau khi đọc qua trang này, và nhìn vào giải pháp thay thế, tôi đã kết thúc bằng mutate_at nhưng với grep để nắm bắt nhiều loại khác nhau của tên cột cùng một lúc (trừ khi bạn luôn có tên cột rõ ràng như vậy!)

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

tôi đã rất vui mừng về việc tìm ra mutate_at + grep, bởi vì bây giờ một dòng có thể làm việc trên nhiều của cột.

EDIT - bây giờ tôi thấy matches() trong số các select_helpers, xử lý regex, vì vậy bây giờ tôi thích điều này.

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

Một nhận xét có liên quan chung khác - nếu bạn có tất cả các cột ngày có tên trùng khớp và định dạng nhất quán, điều này rất mạnh. Trong trường hợp của tôi, điều này biến tất cả các cột YYYYMMDD của tôi, được đọc thành số, thành các ngày.

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

Một cách tổng quát hơn để đạt được loại cột chuyển đổi như sau:

Nếu bạn muốn chuyển đổi tất cả các yếu tố cột của bạn để nhân vật cột, ví dụ, điều này có thể được thực hiện bằng một đường ống :

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

cho trường hợp này, 'df%>% mutate_if (is.factor, as.character)' works (cho phiên bản của dplyr> 0.5) –

Các vấn đề liên quan