Reputation: 13
I want to create a function in R to compare “Current Row Value” and “Previous Row Value. a. If Current Row Value is lower than Previous Row Value then return word LOW b. If Current Row Value is higher than Previous Value then return word HIGH c. If Current Row Value is same as Previous Row Value then return word EQUAL
I want to create a new COLUMN named Decision where the words would be stored like below
Value Decision
1 N/A
2 HIGH
1.5 LOW
1.4 LOW
1.4 EQUAL
Upvotes: 1
Views: 133
Reputation: 887981
We can use case_when
to compare the 'Value' with the previous 'Value' (lag
) and create the column 'Decision' based on whether it is lower or higher
library(dplyr)
df1 %>%
mutate(Decision = case_when(Value < lag(Value) ~ "LOW",
Value > lag(Value) ~ "HIGH", Value == lag(Value) ~ "EQUAL"))
# Value Decision
#1 1.0 <NA>
#2 2.0 HIGH
#3 1.5 LOW
#4 1.4 LOW
#5 1.4 EQUAL
Or another option is to take the difference and then change the label
s in factor
with(df1, c(NA_character_,
as.character(factor(sign(Value[-length(Value)] - Value[-1]),
levels = c(-1, 1, 0), labels = c("HIGH", "LOW", "EQUAL")))))
#[1] NA "HIGH" "LOW" "LOW" "EQUAL"
Or using a for
loop
df1$Decision <- rep(NA_character_, nrow(df1))
for(i in 2: nrow(df1)){
if(df1$Value[i] > df1$Value[i-1]){
df1$Decision[i] <- "HIGH"
} else if(df1$Value[i] < df1$Value[i-1]) {
df1$Decision[i] <- "LOW"
} else df1$Decision[i] <- "EQUAL"
}
If it needs to be a function
f1 <- function(dat, colNm, newCol) {
dat[[newCol]] <- rep(NA_character_, nrow(dat))
for(i in 2: nrow(dat)){
if(dat[[colNm]][i] > dat[[colNm]][i-1]){
dat[[newCol]][i] <- "HIGH"
} else if(dat[[colNm]][i] < dat[[colNm]][i-1]) {
dat[[newCol]][i] <- "LOW"
} else dat[[newCol]][i] <- "EQUAL"
}
dat
}
f1(df1, "Value", "Decision")
df1 <- structure(list(Value = c(1, 2, 1.5, 1.4, 1.4)), class = "data.frame",
row.names = c(NA,
-5L))
Upvotes: 1