按组计算行之间不同列的差异

时间:2016-10-29 18:49:00

标签: r dplyr

我有关于工作站的数据是白天工作的工人,我需要找一个工人在他离开时段的同一个工作站开始工作的天数。每个观察结果是每个工人一个工作日。

 worker.id | start.station | end.station |  day
    1      |     234       |     342     |   2015-01-02
    1      |     342       |     425     |   2015-01-03
    1      |     235       |     621     |   2015-01-04
    2      |     155       |     732     |   2015-01-02
    2      |     318       |     632     |   2015-01-03
    2      |     632       |     422     |   2015-01-04

因此,期望的结果是生成一个变量(相同),用于标识工人在前一天离开时在同一工作站开始的日期(在第一次观察中使用NAFALSE每个工人)。

 worker.id | start.station | end.station |  day         |  same
    1      |     234       |     342     |   2015-01-02 |  FALSE
    1      |     342       |     425     |   2015-01-03 |  TRUE
    1      |     235       |     621     |   2015-01-04 |  FALSE
    2      |     155       |     732     |   2015-01-02 |  FALSE
    2      |     318       |     632     |   2015-01-03 |  FALSE
    2      |     632       |     422     |   2015-01-04 |  TRUE

我认为使用dplyr的内容可行,但不确定是什么。

谢谢!

1 个答案:

答案 0 :(得分:3)

worker.id<-c(1,1,1,2,2,2)
start.station<-c(234,342,235,155,218,632)
end.station<-c(342,425,621,732,632,422)
end.station<-c(342,425,621,732,632,422)
day<-c("2015-01-02"," 2015-01-03"," 2015-01-04"," 2015-01-02"," 2015-01-03"," 2015-01-04")
df<-data.frame(worker.id, start.station ,end.station, day)

  worker.id start.station end.station         day
1         1           234         342  2015-01-02
2         1           342         425  2015-01-03
3         1           235         621  2015-01-04
4         2           155         732  2015-01-02
5         2           218         632  2015-01-03
6         2           632         422  2015-01-04

df$same<-ifelse(df$start.station!=lag(df$end.station) | 
             df$day=="2015-01-02", "FALSE","TRUE")

worker.id start.station end.station        day  same
1         1           234         342 2015-01-02 FALSE
2         1           342         425 2015-01-03  TRUE
3         1           235         621 2015-01-04 FALSE
4         2           155         732 2015-01-02 FALSE
5         2           218         632 2015-01-03 FALSE
6         2           632         422 2015-01-04  TRUE

如果您想按工作人员ID分组但使用ifelse(笨重),请按以下评论中的建议:

df <-df %>%
  group_by(worker.id) %>%
  mutate(same=ifelse(start.station!=lag(end.station) & 
    start.station!=NA, "FALSE","TRUE")) %>% 
  mutate(same=ifelse(is.na(same), "FALSE","TRUE"))

as.data.frame(df)
  worker.id start.station end.station         day  same
1         1           234         342  2015-01-02 FALSE
2         1           342         425  2015-01-03  TRUE
3         1           235         621  2015-01-04 FALSE
4         2           155         732  2015-01-02 FALSE
5         2           218         632  2015-01-03 FALSE
6         2           632         422  2015-01-04  TRUE