2015-04-23 17 views
5

Tôi đang cố sử dụng hàm có điều kiện lead/lag trong ống dplyr bằng ifelse nhưng gặp lỗi. Tuy nhiên, sử dụng cách tiếp cận tương tự bên ngoài đường ống có vẻ như nó hoạt động. Tôi đang thiếu gì?R: dplyr đường dẫn có điều kiện dẫn/trễ sử dụng ifelse với hành vi bất ngờ

require(dplyr) 

dữ liệu:

test <- data.frame(a = c("b","b","b","b","b","b", 
         "m","m","m","m","m","m", 
         "s","s","s","s","s","s"), 
        b = replicate(1,n=18), 
        stringsAsFactors=F) 

ống dplyr:

test %>% 
    mutate(delta = ifelse(a == "s", b + lag(b, n = 2*6), 
         ifelse(a == "m", b + lag(b, n = 1*6), 0))) 

# Error: could not convert second argument to an integer. type=LANGSXP, length = 3 

Nếu không có ống hoạt động:

test$delta <- ifelse(test$a == "s", test$b + lag(test$b, n = 2*6), 
        ifelse(test$a == "m", test$b + lag(test$b, n = 1*6), 0)) 

Tôi tìm thấy một số dấu hiệu cho thấy có một vấn đề với dplyr lead/lag kết hợp với các khung dữ liệu được nhóm. Nhưng tôi không nhóm ở đây.

Thông tin phiên bản: R 3.1.1 và dplyr_0.4.1.

Trả lời

1

dplyr không phân tích cú pháp biểu thức. Một giải pháp là để xác định các chức năng đầu tiên:

foo <- function(a, b) 
    ifelse(a=="s",b+lag(b,n=2*6), ifelse(a=="m",b+lag(b,n=1*6),0)) 
test %>% mutate(delta = foo(a,b)) 
4

này:

test %>% 
    mutate(delta = ifelse(a=="s",b+lag(b,n=12), 
          ifelse(a=="m",b+lag(b,n=6),0))) 

công trình. Điều này có nghĩa là bạn không thể chuyển biểu thức trong các đối số lag.

+2

Nếu vậy, tại sao 'ifelse (kiểm tra $ a == "s", kiểm tra $ b + lag (kiểm tra $ b, n = 2 * 6), ifelse (thử nghiệm $ a == "m", kiểm tra $ b + lag (kiểm tra $ b, n = 1 * 6), 0)) 'hoạt động? –

+2

nó giống như một lỗi 'dplyr'. –

+0

Điều này liên quan đến việc đánh giá các biểu thức. Trong mã này, tất cả các biểu thức được đánh giá trong môi trường toàn cầu, trong trường hợp dplyr, việc đánh giá diễn ra trong môi trường khác nhau. Đây có lẽ là một lỗi trong dplyr. – mpiktas

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