data.table中ifelse函数未生成预期值的技术求助
解决data.table中ifelse多条件赋值的问题
我懂你遇到的困扰了——你的条件写法不符合R的逻辑运算规则,所以才没得到预期结果。
你写的sic==2833|2834|2835|2836是错误的:R的逻辑或运算符|要求两边都是完整的逻辑表达式,单独写2834这类非零数值时,R会自动把它转为TRUE。这就导致你的条件等价于sic==2833 | TRUE | TRUE | TRUE,结果永远是TRUE,自然所有行的new_variable都被赋值成1了。
下面给你几种正确的写法:
方法1:完整的逻辑或表达式
每个值都要和sic做单独比较,再用|连接:
dt.data[, new_variable := ifelse(sic == 2833 | sic == 2834 | sic == 2835 | sic == 2836, 1, 0)]
方法2:用%in%简化多值判断(更推荐)
当需要判断变量是否属于多个值时,%in%比多个|更简洁易读,也不容易写错:
dt.data[, new_variable := ifelse(sic %in% c(2833, 2834, 2835, 2836), 1, 0)]
进阶:直接利用逻辑值转整数(data.table高效写法)
在R里,TRUE会被自动转为1,FALSE转为0,所以你甚至可以省略ifelse,直接把逻辑判断结果转成整数,大数据集下这种写法还更高效:
dt.data[, new_variable := as.integer(sic %in% c(2833, 2834, 2835, 2836))]
内容的提问来源于stack exchange,提问作者Bonsaibubble
相关产品推荐
相关产品推荐

