我面临嵌套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()
.
您可以case_when
从dplyr
库中使用:
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 条件,它将捕获所有不匹配任何早期条件的案例。