2015-02-18 18 views
8

Tôi đang sử dụng gói mới, dplyr và gặp một số khó khăn.biến đổi/biến đổi trong R dplyr (Chuyển chức năng tùy chỉnh)

mutate(df,isOdd=digit%%2) or transform(df,isOdd=digit%%2) 

Cả hai đều hoạt động hoàn hảo.

Tôi đang đặt câu hỏi về cách chuyển phương thức tùy chỉnh.

IsItOdd <- function(x) { 
    if(x%%2==0) 
    result<-"even" 
    else 
    result<-"odd" 
    return(result) 
} 

transform(df,isOdd=IsItOdd(digit)) 

Điều này không hoạt động vì toàn bộ cột của tất cả chữ số được chuyển đến hàm. Có cách nào để thực hiện công việc này không bằng cách chuyển một ô đó sang hàm thay vì toàn bộ cột?

+2

'transform (df, isOdd = vapply (chữ số, IsItOdd, "")) 'hoặc' transform (df, isO dd = Vectorize (IsItOdd) (chữ số)) '? – lukeA

Trả lời

9

Khi biến đổi chức năng của bạn phải hoạt động trên vectơ. Bạn có thể sử dụng ifelse thay vào đó, hoạt động trên vectơ:

isOdd <- function(x){ ifelse(x %% 2 == 0, "even", "odd") } 

Hoặc bạn có thể áp dụng các chức năng cho mọi giá trị trong cột với một trong những apply chức năng:

isOdd <- function(x){ 
    sapply(x, function(x){ 
      if(x %% 2 == 0){ 
       return("even") 
      }else{ 
       return("odd") 
      } 
    })} 
6

Tôi nghĩ bạn cũng có thể sử dụng group_by() để trêu chọc nhau các hàng bởi giá trị duy nhất và sau đó làm tính toán của bạn, như vậy:

df %>% group_by(digit) %>% mutate(isOdd = IsItOdd(digit)) 
Các vấn đề liên quan