dplyr中的substr %>% mutate

5
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) )

我希望能够查明两个不同日期处理的行程中存在的不一致性,即第二天的延迟时间比前一天的最后一个延迟时间短。现在我是这样做的:

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查询不起作用吗? 谢谢!

2个回答

6

已经有一个向量化版本的 substr,即 substring

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      

请原谅我的理解不足:您的答案当然完美无缺,但在 dplyr 调用的上下文中,为什么 delayErr 是一个向量?substr 不是只使用当前行的值吗? - ap53
@ap53 数据框中的每一列都是一个“向量”。我不确定我理解你的问题。 - akrun
这两列之间为什么没有区别? - ap53
@ap53 哪些列? - akrun
对不起,我在编辑器和粘贴代码方面遇到了问题... 我会开始一个新的问题。 - ap53

1

这是因为substr函数希望第二个和第三个参数是单个值,但你提供的是数字向量。你可以使用以下方法创建一个向量化版本的substr函数:

substr2 <- Vectorize(substr)

如果您将原始函数替换为此新函数,则应按预期工作。

“Vectorize(substr)”不就是“substring()”吗? - Rich Scriven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接