R使用if语句将For循环应用于Apply格式

时间:2019-04-17 05:15:38

标签: r for-loop apply lapply sapply

说我有一个看起来像这样的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
 }
}

如何使用R的apply功能使用if语句编写此for循环?

使用此功能我还很陌生,我们将不胜感激。

如有任何疑问,请告诉我。

谢谢。

2 个答案:

答案 0 :(得分:2)

如果要使用嵌套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 :(得分:1)

我们可以尝试使用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循环。