I have this data frame:
| DATE | EVENT | EQUIPMENT | MASK |
|---|---|---|---|
| 2021/12/08 | enterEquipment | L1 | a |
| 2021/12/09 | Decouple | NA | a |
| 2021/12/09 | stateChange | NA | a |
| 2021/12/10 | leaveEquipment | L1 | a |
| 2021/12/10 | enterEquipment | L1 | b |
| 2021/12/11 | Decouple | NA | b |
| 2021/12/11 | stateChange | NA | b |
| 2021/12/11 | leaveEquipment | L1 | b |
I would like to create a new column that contains the data of the equipment column and replace the NA Values with the box above. i wrote this code
DC<-df[order(df$MASK,df$TIMESTAMP),]
Equipement_Correct <- df$EQUIPMENT
Equipement_Correct <-ifelse(is.na(as.character(Equipement_Correct [2:nrow(DC)]))&as.character(DC$MASK[2:nrow(DC)])==as.character(DC$MASK[1:nrow(DC)-1]) & (as.character(DC$EVENT[2:nrow(DC)])=='decouple' | as.character(DC$EVENT[2:nrow(DC)])=='stateChange' |,
as.character(Equipement_Correct [1:nrow(DC)-1]),
as.character(Equipement_Correct [2:nrow(DC)]))
Equipement_Correct <-c(NA,Equipement_Correct )
dfOut<-data.frame(DC,Equipement_Correct)
and I get:
| DATE | EVENT | EQUIPMENT | MASK | Equipement_Correct |
|---|---|---|---|---|
| 2021/12/08 | enterEquipment | L1 | a | L1 |
| 2021/12/09 | Decouple | NA | a | L1 |
| 2021/12/09 | stateChange | NA | a | NA |
| 2021/12/10 | leaveEquipment | L1 | a | L1 |
| 2021/12/10 | enterEquipment | L2 | b | L1 |
| 2021/12/11 | Decouple | NA | b | L2 |
| 2021/12/11 | stateChange | NA | b | NA |
| 2021/12/11 | leaveEquipment | L1 | b | L2 |
and I want to get:
| DATE | EVENT | EQUIPMENT | MASK | Equipement_Correct |
|---|---|---|---|---|
| 2021/12/08 | enterEquipment | L1 | a | L1 |
| 2021/12/09 | Decouple | NA | a | L1 |
| 2021/12/09 | stateChange | NA | a | L1 |
| 2021/12/10 | leaveEquipment | L1 | a | L1 |
| 2021/12/10 | enterEquipment | L2 | b | L1 |
| 2021/12/11 | Decouple | NA | b | L2 |
| 2021/12/11 | stateChange | NA | b | L2 |
| 2021/12/11 | leaveEquipment | L1 | b | L2 |
by using a loop on my code I manage to get the desired result but I would like not to use a loop because I work on millions of lines,
for (i in 1:5) {
Equipement_Correct <-ifelse(is.na(as.character(Equipement_Correct [2:nrow(DC)]))&as.character(DC$MASK[2:nrow(DC)])==as.character(DC$MASK[1:nrow(DC)-1]) & (as.character(DC$EVENT[2:nrow(DC)])=='decouple' | as.character(DC$EVENT[2:nrow(DC)])=='stateChange' |,
as.character(Equipement_Correct [1:nrow(DC)-1]),
as.character(Equipement_Correct [2:nrow(DC)]))
Equipement_Correct <-c(NA,Equipement_Correct )
}
Is there a way not to use a loop?