2016-04-17 62 views
2
pcd <- data.frame(tripNo = c(618, 618, 610, 610, 610, 619), 
       procDate = as.Date(c('2016-03-02', '2016-03-03', '2016-03-02', '2016-03-03', '2016-03-02', '2016-03-03')), 
       delay = c(7.45, 12.90, 11.88, 6.66, 12.50, 9.41)) 

我想在不同的兩天,其中第二日延遲大於前一天的最後一個短的加工行程標誌不一致。現在我已經做了這種方式:SUBSTR在dplyr%>%變異

pcd %>% 
    arrange(tripNo, procDate, delay) %>% 
    group_by(tripNo) %>% 
    mutate(delayErr = (row_number() != 1) & (delay < lag(delay)), 
     Alert = ifelse(delayErr, '!', '')) %>% 
    select(tripNo, procDate, delay, delayErr, Alert) 

    tripNo procDate delay delayErr Alert 
    (dbl)  (date) (dbl) (lgl) (chr) 
1 610 2016-03-02 11.88 FALSE  
2 610 2016-03-02 12.50 FALSE  
3 610 2016-03-03 6.66  TRUE  ! 
4 618 2016-03-02 7.45 FALSE  
5 618 2016-03-03 12.90 FALSE  
6 619 2016-03-03 9.41 FALSE  

所以這個工程確定,我的問題是關於我的第一次嘗試,在我試圖用SUBSTR:

pcd %>% arrange(tripNo, procDate, delay) %>% 
group_by(tripNo) %>% 
mutate(delayErr = (row_number() != 1) & (delay < lag(delay)), 
     Alert = substr(' !', delayErr + 1, delayErr + 1)) %>% # <<< This is the only change 
select(tripNo, procDate, delay, delayErr, Alert) 

    tripNo procDate delay delayErr Alert 
    (dbl)  (date) (dbl) (lgl) (chr) 
1 610 2016-03-02 11.88 FALSE  
2 610 2016-03-02 12.50 FALSE  
3 610 2016-03-03 6.66  TRUE  
4 618 2016-03-02 7.45 FALSE  
5 618 2016-03-03 12.90 FALSE  
6 619 2016-03-03 9.41 FALSE  

有了這個代碼,警報不沒有按我的預期顯示。 有人可以向我解釋爲什麼第二個dplyr查詢不起作用?
謝謝!

回答

3

已經有中substrsubstring

pcd %>% 
    arrange(tripNo, procDate, delay) %>% 
    group_by(tripNo) %>% 
    mutate(delayErr = (row_number() != 1) & (delay < lag(delay)), 
     Alert = substring(' !', delayErr +1, delayErr +1)) %>% 
    select(tripNo, procDate, delay, delayErr, Alert) 
# tripNo procDate delay delayErr Alert 
# (dbl)  (date) (dbl) (lgl) (chr) 
#1 610 2016-03-02 11.88 FALSE  
#2 610 2016-03-02 12.50 FALSE  
#3 610 2016-03-03 6.66  TRUE  ! 
#4 618 2016-03-02 7.45 FALSE  
#5 618 2016-03-03 12.90 FALSE  
#6 619 2016-03-03 9.41 FALSE  
+0

請原諒我缺乏理解:當然你的答案完美無缺,但在dplyr調用的情況下,爲什麼delayErr是一個向量?是不是隻用當前行的值調用substr? – ap53

+0

@ ap53 data.frame中的每一列都是一個'vector'。我不確定我是否理解你的問題。 – akrun

+0

這兩列之間爲什麼沒有區別? – ap53

1

這是因爲substr需要單個值作爲第二個和第三個參數,但是您提供的是數字向量。你可以做SUBSTR的矢量版本

substr2 <- Vectorize(substr) 

如果然後用這個新的功能,如預期它應該工作更換您的原始功能。

+0

向量化版本是不是'矢量化(SUBSTR)''剛子()'? –