R Data.Table Check Group Условие - PullRequest
       47

R Data.Table Check Group Условие

0 голосов
/ 21 марта 2020
data=data.frame("StudentID" = c(1,1,1,2,2,2,3,3,3),
"Grade"=c(1,2,3,1,2,3,1,2,3),
"Score" = c(1,2,5,2,4,3,1,2,2))

У меня есть «данные» и я хочу сделать «data1», где

data1=data.frame("StudentID" = c(1,1,1,2,2,2,3,3,3),
"Grade"=c(1,2,3,1,2,3,1,2,3),
"Score" = c(1,2,5,2,4,3,1,2,2),
"Flag"=c(0,0,0,1,1,1,2,2,2))

И что Flag делает, это указывает, если Score при Grade G для StudentID выше на G-1. Другими словами, мы ожидаем, что оценка будет только go по всем оценкам.

  • Если есть какие-либо значения Score, которые go ниже, чем Grade становится выше, чем Flag равно 1. Связанные результаты должны быть обозначены 2.
  • Если у студента есть балл 2 в Grade 2 и 3, тогда Flag == 2.
  • Если Scores только go повышается как Grade, то увеличивается Flag == 0.

Использование @akron perfect answer, библиотека (data.table) setDT (data) [, flag: = fifelse (any (diff (Score) <0), 1, fifelse (anyDuplicated) (Оценка)> 0, 2, 0)),. (StudentID)]

Теперь скажите, что для студента есть флаг 2.. Как я могу обновить их ВТОРОЙ последовательный счет, добавив 1.

Используя data1 выше

data1=data.frame("StudentID" = c(1,1,1,2,2,2,3,3,3),
"Grade"=c(1,2,3,1,2,3,1,2,3),
"Score" = c(1,2,5,2,4,3,1,2,2),
"Flag"=c(0,0,0,1,1,1,2,2,2),
"Score2" = c(1,2,5,2,4,3,1,2,3))

1 Ответ

1 голос
/ 21 марта 2020

Мы преобразуем в «data.table» (setDT, сгруппированный по «StudentID», используем fifelse для создания «флага», проверив any diff erence в «Score» меньше 0 ( в основном проверяет случаи, когда происходит уменьшение значений), укажите его как 1, если есть дубликаты, то будет 2, а остальные как 0

library(data.table)
setDT(data)[, flag := fifelse(any(diff(Score) < 0), 1, 
      fifelse(anyDuplicated(Score) > 0, 2, 0)) , .(StudentID)]

для обновленного случая

setDT(data1)[Score2 := Score][Flag == 2, Score2 := seq(Score[1], 
          length.out = .N, by = 1), StudentID]

Или с dplyr

library(dplyr)
data %>% 
  group_by(StudentID) %>% 
  mutate(flag = case_when(any(diff(Score) < 0) ~ 1,  
                anyDuplicated(Score) > 0 ~ 2,  TRUE ~ 0))
...