Neil
Neil

Reputation: 8247

how to count unique values with some condition in dplyr in r

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

Answers (1)

Roman
Roman

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

Related Questions