Reputation: 8247
I have following dataframe in r
ship_no equip_name yard
ABC 501 4A
ABC 501 4A
ABC 501 4D
ABC 501 4D
ABC 501 4B
ABC 501 5B
ABC 501 5C
ABC 501 5E
DEF 502 4D
DEF 502 4D
DEF 502 4C
DEF 502 5C
DEF 502 4L
DEF 502 4L
DEF 502 4L
DEF 502 4G
I want to find how many times equip_name
have crossed the yard
.
Now,what I want to do is if equip_name
has changed the yard from 4A to 5A or 4B to 5B, 4C to 5C till 4M to 5M and vice-versa
then it will be horizontal crossover
else vertical crossover
My desired dataframe would be
ship_no equip_name yard Crossovers
ABC 501 4A
ABC 501 4A
ABC 501 4D Vertical
ABC 501 4D
ABC 501 4B Vertical
ABC 501 5B Horizontal
ABC 501 5C Vertical
ABC 501 5E Vertical
DEF 502 4D Vertical
DEF 502 4D
DEF 502 4C Vertical
DEF 502 5C Horizontal
DEF 502 4L Vertical
DEF 502 4G Vertical
Upvotes: 1
Views: 640
Reputation: 17678
You can try:
library(tidyverse)
d %>%
extract(yard, into = c("a","b"),'(\\d+)(\\D+)', remove = FALSE) %>%
group_by(equip_name) %>%
mutate(res=ifelse(a == lag(a), ifelse(b == lag(b), NA, "Vertical"),"Horizontal"))
Source: local data frame [10 x 6]
Groups: equip_name [2]
# A tibble: 10 x 6
ship_no equip_name yard a b res
<fctr> <int> <fctr> <chr> <chr> <chr>
1 ABC 501 4A 4 A <NA>
2 ABC 501 4A 4 A <NA>
3 ABC 501 4D 4 D Vertical
4 ABC 501 4D 4 D <NA>
5 ABC 501 4B 4 B Vertical
6 ABC 501 5B 5 B Horizontal
7 DEF 502 4D 4 D <NA>
8 DEF 502 4D 4 D <NA>
9 DEF 502 4C 4 C Vertical
10 DEF 502 5C 5 C Horizontal
Upvotes: 2