R语言遍历整列判断值是否大于阈值时代码始终执行else分支
问题原因
代码始终执行else分支的核心原因是循环范围写法错误,同时还存在几处逻辑问题会导致结果不符合预期。
原代码具体错误点
- 循环遍历范围错误:
for (i in nrow(dclas))里的nrow(dclas)是单个数值(比如数据集共200行时,这个值就是200),循环只会运行1次,i的取值就是数据集总行数,相当于你只判断了最后一行的年龄。如果最后一行年龄≥13,自然全程触发else分支。 - 赋值逻辑错误:循环内给x赋值时,既没有指定存储当前行结果的位置
x[i],也没有取两个判断列当前行i对应的值,直接调用了整列对象,每次循环都会把x之前的内容完全覆盖。 - 变量调用错误:代码里写的
value.if.age.under.13没有指定所属数据集,R会默认在全局环境搜索同名变量,不会读取dclas表内的对应列,很容易出现取值错误。 - 类型隐患:两个判断列是因子类型,直接读取会返回因子的整数编码,不是预期的T/F布尔值,容易触发隐式类型转换错误。
修正方案
R中优先用向量化运算实现需求,不需要写for循环,运行效率更高,代码也更简洁:
# 第一步:把两个因子类型的T/F列转成逻辑型,避免类型错误 dclas$value.if.age.under.13 <- as.logical(as.character(dclas$value.if.age.under.13)) dclas$value.if.age.over.13 <- as.logical(as.character(dclas$value.if.age.over.13)) # 第二步:用ifelse做向量化判断,直接生成结果列 dclas$judge_result <- ifelse( dclas[[6]] < 13, dclas$value.if.age.under.13, dclas$value.if.age.over.13 )
如果你一定要用for循环实现,修正后的代码如下:
# 提前初始化和数据集行数等长的结果向量,避免循环动态赋值拖慢运行速度 judge_result <- logical(length = nrow(dclas)) # 注意循环范围是1:nrow(dclas),不能只写nrow(dclas) for (i in 1:nrow(dclas)) { if (dclas[i, 6] < 13) { # 取当前行对应的值,存入结果向量的对应位置 judge_result[i] <- dclas$value.if.age.under.13[i] } else { judge_result[i] <- dclas$value.if.age.over.13[i] } } # 把结果存入数据集 dclas$judge_result <- judge_result
内容的提问来源于stack exchange,提问作者ejsiik
相关产品推荐
相关产品推荐

