【问题标题】:R For loop with if statement to Apply formatR For循环与if语句应用格式
【发布时间】:2019-09-07 06:36:33
【问题描述】:

假设我有一个看起来像这样的 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 的应用功能编写带有 if 语句的 for 循环?

我对使用它比较陌生,如果有任何帮助,我们将不胜感激。

如果您有任何问题,请告诉我。

谢谢。

【问题讨论】:

  • 你有&gt;=3 &amp; &lt;=5然后&gt;5 &amp; &lt;7是故意的吗?如果没有,那么 ?cut 可能值得一看 - 例如- cut(sleep, c(0,3,5,7,Inf))

标签: r for-loop apply lapply sapply


【解决方案1】:

如果你想使用嵌套的 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"))))
)

【讨论】:

    【解决方案2】:

    我们可以尝试使用dplyr 库中的case_when

    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 循环。

    【讨论】:

    • 我明白了。最后的 TRUE ~ -1 是什么意思?
    • @mrsquid 如果没有其他条件匹配,则将达到最后的TRUE 情况。理想情况下,这不应该发生(除了可能在 NA 值的情况下),但如果发生了,那么 sleep 将被分配给该行的 -1
    猜你喜欢
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2020-05-25
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    相关资源
    最近更新 更多