-2

I am trying to create a program to iterate through a R data table. I am trying to avoid for loops, because as far as I know they are slow.

#creation of the data table

col <- c(0, 1, 0, 1, 0, 1) 
Priority <- c(1,2,3,4,5,6) #1 highest, 6 lowest
IEC_category <- c("a","b","c","d","e","f")
eventlog_overlap.dt <- data.table(col,Priority, IEC_category)

#comparison and assignation of the priority

if (eventlog_overlap.dt$col == 1){
  if (eventlog_overlap.dt$Priority <= shift(eventlog_overlap.dt$Priority,1)){
    eventlog_overlap.dt$AlarmaPrior <-  eventlog_overlap.dt$IEC_category #write the actual category
  }
  else{
    eventlog_overlap.dt$AlarmaPrior <- shift(eventlog_overlap.dt$IEC_category,1) #write the previous category
  }
  } else{ eventlog_overlap.dt$AlarmaPrior <- NA
  }
Cettt
  • 11,460
  • 7
  • 35
  • 58
Ipa
  • 109
  • 1
  • 8

1 Answers1

1

Pleas provide the desired result. A dplyr attempt:

library(dplyr)
library(hablar)
col <- c(0, 1, 0, 1, 0, 1) 
Priority <- c(1,2,3,4,5,6) #1 highest, 6 lowest
IEC_category <- c("a","b","c","d","e","f")
df <- data.frame(col,Priority, IEC_category)

df %>% 
  mutate(AlarmaPrior = if_else_(col == 1,
                                if_else_(Priority <= lag(Priority), 
                                         IEC_category, 
                                         lag(IEC_category)), NA))

gives you:

  col Priority IEC_category AlarmaPrior
1   0        1            a        <NA>
2   1        2            b           a
3   0        3            c        <NA>
4   1        4            d           c
5   0        5            e        <NA>
6   1        6            f           e
davsjob
  • 1,882
  • 15
  • 10