R Для цикла с оператором if для применения формата - PullRequest
1 голос
/ 17 апреля 2019

Скажем, у меня есть цикл for, который выглядит следующим образом.

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
 }
}

Как бы я написал это для цикла с операторами if, используя функциональность применения R?

Я довольно новичок в использовании этого, и любая помощь будет оценена.

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

, если вы хотите использовать вложенный ifelse, это решение может быть полезно с помощью 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"))))
)
1 голос
/ 17 апреля 2019

Мы можем попробовать использовать case_when из библиотеки dplyr

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
)

Обратите внимание, что case_when(), как и многие функции в R, уже векторизовано.Следовательно, вам не нужно использовать явный цикл for.

...