R语言ifelse多条件(含布尔运算符)应用报错求助
修正R代码实现Discount列计算
我来帮你修正这段代码,先拆解下你原来代码里的几个问题:
- ifelse参数错误:
ifelse()函数只接受3个参数(判断条件、条件为真时的值、条件为假时的值),你多传了第4个参数Coupon,这就是报错的直接原因。 - 逻辑判断写法错误:
Coupon == "OFF10" | "LARGE10"这种写法不符合R的语法逻辑,R会把"LARGE10"当作逻辑值TRUE,导致所有行都会匹配第一个条件,正确的写法应该是判断Coupon是否属于指定的两个值。 - 未处理NA值:你的数据样例里存在Coupon为
NA的情况,原代码没有考虑这种场景,会导致对应行的Discount也变成NA。
推荐的修正代码(简洁易读版)
使用dplyr的case_when()函数,它适合处理多条件分支,代码更清晰:
library(dplyr) # 新增Discount列 NewORdersData <- NewORdersData %>% mutate(Discount = case_when( Coupon %in% c("OFF10", "LARGE10") ~ Sub_Total * 0.1, # OFF10/LARGE10对应10%折扣 Coupon == "OFF5" ~ Sub_Total * 0.05, # OFF5对应5%折扣 TRUE ~ 0 # 处理NA或其他未提及的Coupon值,这里设为0,若要保留NA可替换为NA_real_ ))
用ifelse实现的简洁版本
如果你更倾向于用ifelse(),可以嵌套使用:
library(dplyr) NewORdersData <- NewORdersData %>% mutate(Discount = ifelse( Coupon %in% c("OFF10", "LARGE10"), Sub_Total * 0.1, ifelse(Coupon == "OFF5", Sub_Total * 0.05, 0) ))
验证样例数据的结果
用你提供的前10行数据测试,修正后的代码会生成如下Discount值(以默认设0为例):[2.798, 0, 7.494, 9.185, 8.082, 3.785, 4.88, 10.28, 0, 4.692]
内容的提问来源于stack exchange,提问作者Susan Mwansa
相关产品推荐
相关产品推荐

