编写R函数计算企业评分时出现报错,求解决方案
问题排查与修正
你的代码主要存在两个核心问题,导致结果不符合预期:
1. 评分逻辑偏差
你设定的规则是每个符合条件的指标项给公司加2/6分,但原代码仅统计符合条件的项数,未乘以对应的分值(2/6),最终分数无法匹配规则要求。
2. sum函数使用不规范
原代码中sum(ifelse(...), ifelse(...))的写法,会将两个ifelse返回的向量分别求和后再相加,虽数值结果无差,但更清晰的写法是合并条件后直接统计,避免歧义。
修正后的循环版本代码
# 修正后的评分计算函数 calculate_score <- function(data) { # 创建存储分数的数据框 scores <- data.frame(company = unique(data$company), score = 0) # 遍历每家公司 for (i in 1:nrow(scores)) { # 获取当前公司的所有指标数据 company_data <- data[data$company == scores$company[i], ] # 统计符合加分条件的项数,再乘以2/6得到总分 eligible_count <- sum( (company_data$element_score == "Met" & company_data$status == "No Change") | (company_data$element_score == "Not Met" & company_data$status == "Changed") ) scores$score[i] <- eligible_count * (2/6) } return(scores) } # 测试示例数据集(设置随机种子保证结果可复现) set.seed(123) df <- data.frame( company = rep(c("A", "B", "C", "D", "E", "F"), each = 6), element_score = sample(c("Met", "Not Met", "Not Applicable"), size = 36, replace = TRUE), status = sample(c("No Change", "Changed", "Unsure"), size = 36, replace = TRUE) ) calculate_score(df)
更高效的dplyr分组版本(可选)
若数据集较大,使用dplyr分组计算会比循环更高效:
library(dplyr) calculate_score_dplyr <- function(data) { data %>% group_by(company) %>% summarise( score = sum( (element_score == "Met" & status == "No Change") | (element_score == "Not Met" & status == "Changed") ) * (2/6) ) %>% ungroup() } # 测试 calculate_score_dplyr(df)
关键修正点说明
- 用
|合并两个加分条件,直接统计符合要求的指标项数 - 项数乘以
2/6,严格匹配你设定的评分规则 - 加入
set.seed(123)让随机生成的示例数据结果可复现,便于调试
内容的提问来源于stack exchange,提问作者e. erhan
相关产品推荐
相关产品推荐

