R语言mutate搭配if else新建数据框列报错解决方法
代码问题排查
代码共存在4个问题,直接触发了报错和逻辑错误:
- 语法括号错位:
if语句的判断条件没有被完整包裹在括号内。比如第一个判断写为if (il.count.description + un.count.description) > elle.count.description + une.count.description),相当于if仅对括号内的il.count.description + un.count.description做判断,后续的>比较符直接暴露在语句结构外,是触发unexpected '}'语法报错的直接原因。 - 赋值逻辑错误:分支块内使用了比较运算符
==而非赋值逻辑。second.indicator == -1的作用是「判断已存在的second.indicator列是否等于-1」,而非给新列赋值-1,代码会尝试访问还未创建的second.indicator列做判断,直接触发'second.indicator' not found报错。 - 语句适用场景错误:R原生的
if...else是标量判断语句,仅能处理单个逻辑值,放在mutate中使用时只会取第一行的计算结果给整列赋值,无法实现逐行判断的需求,哪怕修正语法和赋值错误,最终计算结果也不符合预期。 - 样例数据列名错误:提供的样例数据最后一列列名重复写为
un.count.description,和第三列重名,与判断规则中用到的une.count.description不符,不修正的话会额外触发找不到对象的报错。
正确修改方案
dplyr的mutate中做逐行多条件判断,优先推荐使用case_when()函数,语法清晰不易出错,代码如下:
library(dplyr) # 先修正样例数据的列名问题 data <- data.frame( il.count.description = c(5,9,1,10), elle.count.description = c(1,2,1,9), un.count.description = c(5,2,0,0), une.count.description = c(1,6,0,8) ) # 计算新列 data <- data %>% mutate( # 可提前计算两侧求和值,避免重复写表达式 left_val = il.count.description + un.count.description, right_val = elle.count.description + une.count.description, second.indicator = case_when( left_val > right_val ~ -1, left_val == right_val ~ 0, TRUE ~ 1 # 匹配其余所有情况 ) ) %>% select(-left_val, -right_val) # 删除临时计算的中间列,不需要可省略
如果偏好嵌套判断的写法,可使用支持逐行判断的ifelse()函数替代原生if...else语句,代码如下:
data <- data %>% mutate( second.indicator = ifelse( il.count.description + un.count.description > elle.count.description + une.count.description, -1, ifelse( il.count.description + un.count.description == elle.count.description + une.count.description, 0, 1 ) ) )
运行后即可得到符合赋值规则的second.indicator列。
内容的提问来源于stack exchange,提问作者Fella
相关产品推荐
相关产品推荐

