R语言if_else函数报错:false需为逻辑向量而非双精度向量的解决
问题排查与解决:if_else类型不匹配错误
数据集示例
scf=structure(list(MDM_Key = c(44L, 44L, 44L, 47L, 47L, 47L), month_id = c(202307L, 202305L, 202306L, 202307L, 202305L, 202306L), sale_count = c(NA, 73542L, NA, NA, 1852L, NA), prop_base_price_prc = c(0.05, 0.05, 0.05, 0.05, 0.05, 0.05), subgroup_id = c("05,04,01", "05,04,01", "05,04,01", "04,03,02", "04,03,02", "04,03,02"), ML.coef = c(1.43, 1.43, 1.43, 1.46, 1.46, 1.46)), class = "data.frame", row.names = c(NA, -6L))
执行代码
scf %>% arrange(MDM_Key, month_id) %>% mutate(ML.coef = if_else(!is.na(sale_count), NA, ML.coef), percent = scf$prop_base_price_prc * ML.coef * 100, prop = (percent / 100) * sale_count[1], final = sale_count[1] + prop, .by = MDM_Key)
错误信息
Error in `mutate()`: ! Problem while computing `ML.coef = if_else(!is.na(sale_count), NA, ML.coef)`. Caused by error in `if_else()`: ! `false` must be a logical vector, not a double vector.
错误原因
dplyr::if_else是严格类型匹配的函数,要求true和false分支的返回值类型完全一致。这里条件为TRUE时返回的NA是逻辑型NA(R中默认的NA属于逻辑类型),而false分支的ML.coef是数值型(double),两者类型不匹配,触发报错。
另外原代码中scf$prop_base_price_prc的写法存在隐患:管道内应该直接使用列名,避免分组操作(.by=MDM_Key)时引用整个原数据集的列,导致逻辑错误。
解决方法
方法1:使用数值型NA匹配类型
将if_else中的NA替换为NA_real_(数值型的NA),确保两个分支类型一致,同时修正列引用方式:
scf %>% arrange(MDM_Key, month_id) %>% mutate(ML.coef = if_else(!is.na(sale_count), NA_real_, ML.coef), percent = prop_base_price_prc * ML.coef * 100, prop = (percent / 100) * sale_count[1], final = sale_count[1] + prop, .by = MDM_Key)
方法2:使用基础R的ifelse函数
基础R的ifelse函数类型检查不严格,会自动转换类型,也可以解决问题:
scf %>% arrange(MDM_Key, month_id) %>% mutate(ML.coef = ifelse(!is.na(sale_count), NA, ML.coef), percent = prop_base_price_prc * ML.coef * 100, prop = (percent / 100) * sale_count[1], final = sale_count[1] + prop, .by = MDM_Key)
内容的提问来源于stack exchange,提问作者psysky
相关产品推荐
相关产品推荐

