如何使用基 R 中的嵌套 ifelse() 结构简化处理?

jay*_*.sf 3 if-statement r

我面临嵌套ifelse()结构:

df1$var <- ifelse(x < a, u, ifelse(x < b, v, ifelse(x < c, w, ...)))
Run Code Online (Sandbox Code Playgroud)

其中u, v, w, ...s 实际上是函数

一个简化的工作示例是

df1 <- data.frame(x = rbinom(100, 5, .5))
df1$y <- ifelse(x == 1, "s", ifelse(x == 2, "t", 
                                    ifelse(x == 3, "u", ifelse(x == 4, "v", "w"))))
Run Code Online (Sandbox Code Playgroud)

我认为理想情况下可能有一个基本的 R方法(为了速度)来简化这样的代码;最终是一个函数

rave.ifelse(x, 1=s, 2=t, ...)
Run Code Online (Sandbox Code Playgroud)

我看了一眼,cut(x, 5)但从这个角度来看,它让我感到困惑。

注意: 的x可以是数字或因子,==也可以是任何逻辑运算符,s, t, ...实际上是函数

编辑:

注意:ifelse() s的数量是已知的并且很大。解决方案确实应该适合这种df1$var <- ifelse(x < a, u, ifelse(x < b, v, ifelse(x < c, w, ...)))情况,当u, v, w, ...s 是函数时,例如u=sample(0:9, 1), v=runif(1),.... 它不应该比ifelse().

Tim*_*sen 5

您可以case_whendplyr库中使用:

df1$y <- case_when(
    x == 1 ~ "s",
    x == 2 ~ "t",
    x == 3 ~ "u",
    x == 4 ~ "v",
    TRUE ~ "w"
)
Run Code Online (Sandbox Code Playgroud)

请注意,上面的最后一个案例 ( TRUE) 是一揽子 else 条件,它将捕获所有不匹配任何早期条件的案例。