我有关于工作站的数据是白天工作的工人,我需要找一个工人在他离开时段的同一个工作站开始工作的天数。每个观察结果是每个工人一个工作日。
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
因此,期望的结果是生成一个变量(相同),用于标识工人在前一天离开时在同一工作站开始的日期(在第一次观察中使用NA
或FALSE
每个工人)。
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
的内容可行,但不确定是什么。
谢谢!
答案 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