Зацикливание по строкам фрейма данных в R

#r #tidyverse

Вопрос:

Петли в Ряд

У меня есть следующий набор данных, касающийся оценок учащихся.

 name <- c("John", "Rachel", "Judy", "James", "Oloo")

english <- c("70", "50e", "19c", "38^", "33^")

math <- c("65", "25c", "68", "32^", "50")

science <- c("45", "50", "25c", "27e", "72")
             
social <- c("56", "76", "42", "23^", "68")    

marks <- data.frame(name, english, math, science, social)

marks
             
 

Чтобы студент сдал экзамен, он должен сдать как непрерывную оценку, так и итоговый экзамен и набрать не менее 40% баллов по каждому предмету.

Pass : Где у студента НЕТ e или ^ после отметок, означающих, что все баллы равны 40 и более.

Supplementary : Где у студента есть a ^ или an e . ^ Средний балл меньше 40. У студентов e может быть более 40 баллов, но они все еще не смогли пройти непрерывную оценку.

special : У студента есть c , но НЕТ e или ^ .

Supplementary and special : Сочетание дополнительного и специального. Это означает , что у студента есть e ^ или и то, и другое, и в то же время есть c .

Discontinued : У студента есть 4 или более e , 4 или более ^ . Также у студента может быть комбинация e , и ^ это происходит 4 или более раз. Задача: Для каждого учащегося (то есть строки данных) я хочу, чтобы в коде R был возвращен новый столбец, comment как показано ниже.

 name <- c("John", "Rachel", "Judy", "James", "Oloo")

english <- c("70", "50e", "19c", "38^", "33^")

math <- c("65", "25c", "68", "32^", "50")

science <- c("45", "50", "25c", "27^", "72")
             
social <- c("56", "76", "42", "23^", "68")  

comment <- c("Pass", "Supplementary amp; Special", "Special", "Discontinued", "Supplementary")

marks_1 <- data.frame(name, english, math, science, social, comment)

marks_1
             
 

Еще раз обратите внимание:
Pass : Где у студента НЕТ e или ^ после отметок, означающих, что все баллы равны 40 и более.

Supplementary : Где у студента есть a ^ или an e . ^ Средний балл меньше 40. У студентов e может быть более 40 баллов, но они все еще не смогли пройти непрерывную оценку.

special : У студента есть c , но НЕТ e или ^ .

Supplementary and special : Сочетание дополнительного и специального. Это означает , что у студента есть e ^ или и то, и другое, и в то же время есть c .

Discontinued : У студента есть 4 или более e , 4 или более ^ . Также у студента может быть комбинация e , и ^ это происходит 4 или более раз.

Комментарии:

1. Когда студент получает «Особую» ценность ? Когда это «прекращено» ? Как выглядит строка 5 Supplementary , но строка 2 Supplementary amp; Special ?

2. Ронак, Спасибо. Особое — там, где есть c . Дополнительный — когда есть ^ или e . Прекращено: Если по 4 или более предметам студент получает менее 40 баллов или 4 e или 4 ^ балла . Пройдите там, где у студента нет c , e , и ^ , что означает, что все предметы имеют более 40 баллов и более. Строка 5 является дополнительной, потому что у студента 33^. Строка 2 является дополнительной и специальной, потому что у ученика есть e оценки и c после них. Может быть, я плохо это объясняю.

3. Pass : Если у студента НЕТ e или ^ , все баллы равны 40 и более. Supplementary : Где у студента есть a ^ или an e . ^ Средний балл меньше 40. У студентов e может быть более 40 баллов, но они все еще не смогли пройти непрерывную оценку. special : У студента есть c , но НЕТ e или ^ . Supplementary and special : Сочетание дополнительного и специального. Это означает , что у студента есть e ^ или и то, и другое, и в то же время есть c . Discontinued : У студента есть 4 или более e , 4 или более ^ ИЛИ комбинация e , и ^ это происходит 4 или более раз.

Ответ №1:

Я думаю, что вам нужно записать каждое правило вручную и применить их для каждой строки.

 library(dplyr)

apply_rules <- function(x) {
  e_rule <- any(grepl('e', x, fixed = TRUE))
  c_rule <- any(grepl('c', x, fixed = TRUE))
  fail_rule <- any(grepl('^', x, fixed = TRUE))
  case_when(all(grepl('[\^e]', x)) ~ 'Discontinued',
            (e_rule || fail_rule) amp;amp; c_rule ~ 'Supplementary amp; Special', 
            fail_rule || e_rule ~ 'Supplementary',
            c_rule amp;amp; (c_rule || fail_rule) ~ 'Special', 
            !(e_rule ||  c_rule) ~ 'Pass', 
            fail_rule ~ 'Discontinued' 
            )
}

marks %>%
  rowwise() %>%
  mutate(comment = apply_rules(c_across(english:social)))

#  name   english math  science social comment                
#  <chr>  <chr>   <chr> <chr>   <chr>  <chr>                  
#1 John   70      65    45      56     Pass                   
#2 Rachel 50e     25c   50      76     Supplementary amp; Special
#3 Judy   19c     68    25c     42     Special                
#4 James  38^     32^   27^     23^    Discontinued           
#5 Oloo   33^     50    72      68     Supplementary