dplyr中replace()函数条件修改变量值失败:替代case_when()的高效实现求助
问题解析与解决方案
你遇到的这个警告问题,核心是对replace()函数的参数逻辑理解有误。咱们来拆解一下:
为什么replace()会报错?
replace()的语法是replace(x, list, values),其中:
x是要修改的向量list是要替换元素的位置/条件values是对应要替换进去的值,它的长度必须和list筛选出的元素数量一致,或者是单个可重复的值
你写的replace(close, close > 100, close/100)里,close/100是整个close向量除以100后的完整向量,而close > 100筛选出的只是其中一部分元素。当这两个长度不匹配时,R就会抛出"替换项数量不是替换长度的倍数"的警告,因为它不知道怎么把一整个向量塞进数量更少的位置里。
而case_when()之所以能正常工作,是因为它会逐元素判断条件,满足条件的元素用close/100(此时是该元素自身除以100),不满足的保留原值,逻辑是逐元素对应的。
怎么让replace()正常工作?
只需要把values部分改成仅针对满足条件的元素计算即可,也就是提取出close中大于100的部分再除以100:
price %>% mutate(close = replace(close, close > 100, close[close > 100]/100))
这样一来,values的长度就和list筛选出的元素数量完全匹配,替换就能正常执行了。
另外,还有一种更简洁的写法可以达到同样效果,用ifelse:
price %>% mutate(close = ifelse(close > 100, close/100, close))
它的逻辑和case_when()类似,也是逐元素判断赋值,代码更紧凑。
内容的提问来源于stack exchange,提问作者Marcio Bernardo
相关产品推荐
相关产品推荐

