Reputation: 635
Say I have a for loop that looks like this.
person <- c("Mike", "Kim", "Fred", "Steve", "Quail", "bean")
sleep <- c(5, 10, 3, 7, 1, 5)
dat <- data.frame(person, sleep)
for (i in 1:length(dat$person)) {
if (dat$sleep[i] >= 7) {
dat$fatigue[i] <- 0
}
if (dat$sleep[i] > 5 & dat$sleep[i] < 7) {
dat$fatigue[i] <- 1
}
if (dat$sleep[i] >= 3 & dat$sleep[i] <= 5) {
dat$fatigue[i] <- 2
}
if (dat$sleep[i] < 3) {
dat$fatigue[i] <- 3
}
}
How would I write this for loop with the if statements using the apply functionality of R?
I am rather new to using this and any help would be appreciated.
Please let me know if you have any questions.
Thank you.
Upvotes: 1
Views: 123
Reputation: 1443
if you want to use nested ifelse this solution can be useful using baseR
person <- c("Mike", "Kim", "Fred", "Steve", "Quail", "bean")
sleep <- c(5, 10, 3, 7, 1, 5)
dat <- data.frame(person, sleep)
dat$fatigue <- ifelse(dat$sleep < 3,3,ifelse(dat$sleep >= 3 & dat$sleep <= 5, 2,ifelse(dat$sleep > 5 & dat$sleep < 7,1,ifelse(dat$sleep >= 7, 0,"NA"))))
)
Upvotes: 2
Reputation: 522234
We can try using case_when
from the dplyr
library
dat$fatigue <- case_when(
dat$sleep < 3 ~ 3,
dat$sleep >= 3 & dat$sleep <= 5 ~ 2,
dat$sleep > 5 & dat$sleep < 7 ~ 1,
dat$sleep >= 7 ~ 0,
TRUE ~ -1
)
Note that case_when()
, like many functions in R, is already vectorized. Therefore, you don't need to use an explicit for
loop.
Upvotes: 1