R语言:遍历分类变量赋值生成向量时结果为NULL的问题修复
问题分析与修复方案
我来帮你梳理下代码里的问题,以及给出更简洁高效的解决办法~
你的代码为什么会返回NULL?
有两个关键错误导致了这个结果:
return()放错位置:你把return(wgts)写在了循环内部,这会让循环第一次执行时就直接终止并返回,此时wgts还没被任何值填充,自然就是NULL。ifelse与append的用法错误:ifelse是向量化函数,不需要放在循环里逐行调用;另外append(wgts[y], ...)的写法不对——空向量wgts一开始没有wgts[y]这个索引,应该直接向wgts本身追加元素。
修复方案
方案1:修正你的循环代码
如果一定要用循环实现,调整后的代码如下:
wgts = c() for (y in 1:nrow(train)) { if (train$default[y] == "yes") { wgts = append(wgts, 10) } else { wgts = append(wgts, 1) } } # 脚本里执行的话不需要return,直接调用wgts就能得到结果
这里把ifelse换成了普通的if-else分支,移除了循环内的return,并且修正了append的调用方式。
方案2:推荐用R的向量化操作(更高效简洁)
R是向量化编程语言,完全不需要写循环就能实现需求,而且速度更快,代码更易读:
# 直接用向量化的ifelse处理整个向量 wgts = ifelse(train$default == "yes", 10, 1)
这个方法会一次性对train$default的所有元素进行判断,对应位置输出10(当值为"yes")或1(当值为"no"),一步到位。
方案3:用匹配函数实现(另一种向量化思路)
如果你偏好使用匹配逻辑,也可以用match函数:
wgts = c(1, 10)[match(train$default, c("no", "yes"))]
这里match会把"no"映射为1,"yes"映射为2,然后通过索引从c(1,10)里取出对应的值。
内容的提问来源于stack exchange,提问作者Jane Miller
相关产品推荐
相关产品推荐

