R语言如何在lapply函数中编写多条件语句避免使用for循环
在lapply中实现无显式循环的多条件判断(无dplyr依赖)
已有双条件实现参考
先构造测试用向量:
set.seed(10) vctr <- c(sample(-3:5), rep(0,3), sample(-3:5), 0)
双条件场景规则:
- 元素值等于0:原值加1
- 元素值不等于0:保持原值
可正常运行的参考代码:
test_list <- lapply(1:length(vctr), function(x) if(vctr[x]==0) vctr[x] +1 else vctr[x])
四条件分支正确实现
规则梳理
- 条件1:元素值等于0时,值加1
- 条件2:元素值为负数时,替换为其绝对值
- 条件3:元素值大于0且小于3时,原值加2
- 条件4:元素值大于等于3时,保持原值不变
报错原因
之前的代码属于语法错误:R中多分支if判断需要用链式else if衔接分支,不能拆成独立的if加else结构,否则语法解析会直接失败。
可运行代码
更推荐直接遍历向量元素(不用走索引,代码可读性更高):
test_list <- lapply(vctr, function(val) { if (val == 0) { val + 1 } else if (val < 0) { abs(val) } else if (val > 0 & val < 3) { val + 2 } else { val } })
如果需要沿用索引遍历的写法,对应代码如下:
test_list2 <- lapply(1:length(vctr), function(x) { val <- vctr[x] if (val == 0) val + 1 else if (val < 0) abs(val) else if (val > 0 & val < 3) val + 2 else val })
补充说明
- 分支判断顺序和规则优先级绑定,当前写法先匹配0值、再匹配负数、再匹配(0,3)区间正数,最后兜底≥3的场景,不会出现逻辑覆盖问题
- 如果最终需要向量格式而非列表,直接在外层套
unlist()即可,例如res_vctr <- unlist(test_list)
内容的提问来源于stack exchange,提问作者ramen
相关产品推荐
相关产品推荐

