r - 如何用奇怪的规则获得总分
问题描述
我有一个看起来像这样的示例数据:
每个 ID 有 2 个主题测试:test1 和 test2。总体测试结果来自两个主题测试。如果我想按照规则计算每个 ID 的最终测试结果:
如果一个人的科目考试成绩有一个P,那么他的考试成绩就是P;如果一个人的科目考试成绩是N,而不是P,那么他的考试成绩是N;如果一个人的科目测试结果都是N/A,那么就是N/A。如果一个人的测试1和2的最终结果都是P,那么他的总成绩就是P,如果一个人的测试1和2的最终成绩都是N,那么他的总成绩就是N;如果一个人的测试1和2的最终结果是N/A而不是P,那么他的整体是N/A;它是一种巧妙地计算整体测试结果的方法。我怎样才能实现这个目标。我想我需要为overall_test1 和overall_test2 建立一个新变量,然后计算整体。R 新手,不知道如何处理字母。
结果应该是这样的:
样本数据可以从以下代码中获取:
ID <-c("1", "1", "1","2", "2","3", "3", "3")
Test_date <-c("2020-07-09", "2020-07-19","2020-07-29", "2020-07-07","2020-07-18","2020-07-09", "2020-07-19","2020-07-29")
Test1 <-c("N/A","P","N","N/A", "N","N","N/A", "N")
Test2<-c("N/A","P","P","N/A","N/A","N/A","N/A", "N")
Sample.data <- data.frame(ID, Test_date, Test1, Test2)
解决方案
在这种情况下,您将需要使用字符串检测。
尝试这个:
final_classifications =
Sample.data %>%
mutate(
Test1 = str_replace(Test1, "N/A", "Z"),
Test2 = str_replace(Test2, "N/A", "Z")
) %>%
group_by(ID) %>%
mutate(P = (any(str_detect(Test1, 'P'))),
N = (any(str_detect(Test1, 'N'))),
overall_1 = ifelse(P == "TRUE", "P",
ifelse(N == "TRUE", "N", "N/A")),
P2 = (any(str_detect(Test2, 'P'))),
N2 = (any(str_detect(Test2, 'N'))),
overall_2 = ifelse(P2 == "TRUE", "P",
ifelse(N2 == "TRUE", "N", "N/A")),
overall = ifelse(overall_1 == "P" | overall_2 == "P", "P",
ifelse(overall_1 == "N/A" | overall_2 == "N/A", "N/A", "N"))
) %>%
select(ID, overall) %>%
unique()
我在第一个变异步骤中将“N/A”替换为“Z”,以避免在寻找“N”时使用 str_detect 拾取“N/A”单元格。可能有更直接的方法可以避免这种情况。
推荐阅读
- facebook-ads-api - 列出来自视频 ID 的所有广告视频
- psql - 如何定位 /etc/postgresql/10/main/pg_hba.conf
- c# - 将项目列表分配给另一个列表 Linq 中的特定属性
- ios - 如何提高旧 IPAD 应用程序的响应时间
- python-3.x - 非零退出代码
- python - 如何根据列值将数据框中的单行分成多行?
- bash - 如何 git checkout 来自与特定模式匹配的另一个分支的所有文件?
- php - POST 与 GET 的推荐
- reactjs - 如何从 JSON 构造多个 React 组件并立即返回它?
- python-3.x - 包含字典的数据框列上的字典操作