R语言基于MY_CARS_SALES数据集指定列规则计算行总得分问题
R代码问题排查与修改方案
原代码错误点
- PRICE列判断逻辑完全错误:原代码写为
x == '6:10',该语句作用是判断值是否等于字符串"6:10",既不符合「取值介于6到16之间」的规则,也写错了范围阈值。 - SMOKE列判断不规范:SMOKE是数值型列,无需和字符串
'0'比较,直接和数值0判断即可,避免R隐式转换带来的潜在问题。
修改后的正确代码
MY_CARS_SALES$NEWSCORE <- rowSums(cbind( # 规则1:VOLVO、VW小于对应列中位数得1分 sapply(MY_CARS_SALES[c("VOLVO" , "VW")], function(x){ifelse(x < median(x), 1, 0)}), # 规则2:NISSAN、ROVER大于对应列中位数得1分 sapply(MY_CARS_SALES[c("NISSAN", "ROVER")], function(x){ifelse(x > median(x), 1, 0)}), # 规则3:SMOKE等于0得1分 sapply(MY_CARS_SALES["SMOKE"], function(x) {ifelse(x == 0, 1, 0)}), # 规则4:PRICE介于6到16之间得1分 sapply(MY_CARS_SALES["PRICE"], function(x) {ifelse(x >=6 & x <=16, 1, 0)}), # 规则5:ANTIQUE等于YES得1分 sapply(MY_CARS_SALES["ANTIQUE"], function(x) {ifelse(x == 'YES', 1, 0)}) ))
简化写法(可选)
逻辑判断本身会返回TRUE/FALSE,直接转数值就是1/0,可以去掉ifelse简化代码:
MY_CARS_SALES$NEWSCORE <- rowSums(cbind( sapply(MY_CARS_SALES[c("VOLVO" , "VW")], function(x) as.integer(x < median(x))), sapply(MY_CARS_SALES[c("NISSAN", "ROVER")], function(x) as.integer(x > median(x))), as.integer(MY_CARS_SALES$SMOKE == 0), as.integer(MY_CARS_SALES$PRICE >=6 & MY_CARS_SALES$PRICE <=16), as.integer(MY_CARS_SALES$ANTIQUE == "YES") ))
内容的提问来源于stack exchange,提问作者lofus77
相关产品推荐
相关产品推荐

