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_all
và mutate_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_each
và vars()
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")))
Trong trường hợp này, bạn cũng có thể sử dụng 'starts_with()' – hadley
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ố. –
@docendodiscimus đúng là – hadley