DataTable Reformat - PullRequest
       5

DataTable Reformat

0 голосов
/ 18 апреля 2020
    d1=data.frame("Student"=c(1,1,1,2,2,2,3,3,4,4,4),
    "Score"=c(1,1,1,1,2,2,1,3,1,2,3),
    "Grade"=c(5,6,7,3,4,5,2,4,7,8,9),
    "Class"=c(1,1,1,1,1,1,2,2,1,1,1),
    "School"=c(100,100,100,100,100,100,92,92,81,81,81))


    d2=data.frame("Student"=c(1,2,3,4,5),
"Q1"=c(0,1,0,1),
    "VX"=c(0,0,1,1),
    "A"=c(5,3,2,7),
    "B"=c(7,3,4,7),
    "C"=c(7,4,4,8),
    "D"=c(7,5,4,9),
    "Class"=c(1,1,2,1),
    "School"=c(100,100,92,81))

У меня есть данные 'd1' и wi sh для данных 'd2' с правилами:

Ученик: Только ученик из d1

Q1: если оценка от d1 когда-либо равняется 2 для студента из d1, это равно 1. Если нет, то равно 0.

VX: если оценка от d1 когда-либо равнялась 3 для студента из d1, это равно 1. Если нет равно 0.

A: равно первому / минимальному баллу от d1 для студента

B: если балл от d1 равен 2, то ставьте оценку просто перед тем, как это произошло. Если нет, тогда поставьте последнюю / максимальную оценку. Важно отметить, что первая оценка не может быть равна 2, поэтому не стоит беспокоиться о пропущенных данных.

C: если показатель от d1 равен 2, тогда ставьте оценку, когда это произошло. Если нет, тогда поставьте последнюю / максимальную оценку

D: если оценка от d1 равнялась 3, тогда поставьте оценку, когда это произошло. Если нет, укажите последнюю / максимальную оценку

Класс: Just the Class из d1

Школа: Just the School из d1

1 Ответ

1 голос
/ 19 апреля 2020

В data.table мы можем сделать. :

library(data.table)

setDT(d1)[,.(Q1 = as.integer(any(Score == 2)), 
        VX = as.integer(any(Score == 3)), 
         A = first(Grade), 
         B = if(any(Score == 2)) Grade[which.max(Score == 2) - 1] else max(Grade),
         C = if(any(Score == 2)) Grade[which.max(Score == 2)] else max(Grade),
         D = if(any(Score == 3)) Grade[which.max(Score == 3)] else max(Grade)), 
     .(Student, Class, School)]


#   Student Class School Q1 VX A B C D
#1:       1     1    100  0  0 5 7 7 7
#2:       2     1    100  1  0 3 3 4 5
#3:       3     2     92  0  1 2 4 4 4
#4:       4     1     81  1  1 7 7 8 9

Использование dplyr здесь может быть несколько выгодно с точки зрения набора текста, поскольку мы можем ссылаться на ранее созданные столбцы Q1 и VX.

library(dplyr)

d1 %>%
  group_by(Student, Class, School) %>%
  summarise(Q1 = as.integer(any(Score == 2)), 
            VX = as.integer(any(Score == 3)), 
             A = first(Grade), 
             B = if(Q1) Grade[which.max(Score == 2) - 1] else max(Grade), 
             C = if(Q1) Grade[which.max(Score == 2)] else max(Grade), 
             D = if(VX) Grade[which.max(Score == 3)] else max(Grade))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...