如何用R语言的if else与循环函数简化下述代码语法?
代码优化建议
原代码存在的问题
- 大量重复的
if else判断,代码冗余,后续维护(比如新增分类)会非常麻烦 - 错误地将
print()的返回值(NULL)赋值给peramalan,这应该不是你的真实需求;同时peramalan初始长度设为n,但循环中赋值给i+1,最后一次循环会出现越界报错
优化方案
步骤1:将分散的y变量整合到命名列表
把yA1到yA23按名称对应存入列表,通过字符串索引直接取值:
# 创建分类与对应值的映射列表 y_mapping <- list( A1 = yA1, A2 = yA2, A3 = yA3, A4 = yA4, A5 = yA5, A6 = yA6, A7 = yA7, A8 = yA8, A9 = yA9, A10 = yA10, A11 = yA11, A12 = yA12, A13 = yA13, A14 = yA14, A15 = yA15, A16 = yA16, A17 = yA17, A18 = yA18, A19 = yA19, A20 = yA20, A21 = yA21, A22 = yA22, A23 = yA23 )
步骤2:简化循环逻辑
不需要一堆条件判断,直接通过索引取值,同时修正数组长度问题:
n <- length(Tabel_FLR$fuzzifikasi) # 调整peramalan长度为n+1,避免越界 peramalan <- array(NA, dim = c(n + 1)) for(i in 1:n){ # 直接从映射列表取对应值赋值 peramalan[i+1] <- y_mapping[[Tabel_FLR$fuzzifikasi[i]]] # 如果确实需要打印,单独执行print print(y_mapping[[Tabel_FLR$fuzzifikasi[i]]]) }
更高效的向量化写法(替代循环)
R语言优先推荐向量化操作,代码更简洁且效率更高:
n <- length(Tabel_FLR$fuzzifikasi) peramalan <- array(NA, dim = c(n + 1)) # 批量赋值peramalan的第2到n+1位 peramalan[2:(n+1)] <- unlist(y_mapping[Tabel_FLR$fuzzifikasi]) # 批量打印对应值 print(unlist(y_mapping[Tabel_FLR$fuzzifikasi]))
优化优势
- 消除冗余代码,后续新增分类(比如A24)只需在
y_mapping中添加元素,无需修改核心逻辑 - 向量化写法避免循环开销,数据量大时性能提升明显
- 代码逻辑更清晰,可读性更强
内容的提问来源于stack exchange,提问作者Amsal Esa Hasana
相关产品推荐
相关产品推荐

