首页 > 解决方案 > 如何用奇怪的规则获得总分

问题描述

我有一个看起来像这样的示例数据:

在此处输入图像描述

每个 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)

标签: r

解决方案


在这种情况下,您将需要使用字符串检测。

尝试这个:

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”单元格。可能有更直接的方法可以避免这种情况。


推荐阅读