Назначьте максимальное значение группы для всех строк в этой группе - PullRequest
2 голосов
/ 26 мая 2019

Я хотел бы назначить максимальное значение группы для всех строк в этой группе. Как мне это сделать?

У меня есть датафрейм, содержащий названия группы и максимальное количество кредитов, которые ей принадлежат.

course_credits <- aggregate(bsc_academic$Credits, by = list(bsc_academic$Course_code), max)

, что дает

    Course    Credits
1   ABC1000  6.5
2   ABC1003  6.5
3   ABC1004  6.5
4   ABC1007  5.0
5   ABC1010  6.5
6   ABC1021  6.5
7   ABC1023  6.5

Основной фрейм данных выглядит так:

Appraisal.Type   Resits   Credits Course_code   Student_ID          
Final result       0       6.5    ABC1000           10                
Final result       0       6.5    ABC1003           10               
Grade supervisor   0       0      ABC1000           10               
Grade supervisor   0       0      ABC1003           10 
Final result       0       12     ABC1294           23   
Grade supervisor   0       0      ABC1294           23     

Как видите, студент 10 прошел курс ABC1000 стоимостью 6,5 кредитов. Однако для каждого курса (на каждого учащегося) существуют две строки: итоговый результат и руководитель оценки. В конце концов, окончательный результат должен быть удален, но кредиты должны быть сохранены. Поэтому я хочу назначить максимальное значение 6,5 для строки руководителя уровня. Кроме того, студент 23 прошел курс ABC1294, стоимостью 12 кредитов.

В конце концов, это должен быть результат:

Appraisal.Type   Resits   Credits Course_code   Student_ID                      
Grade supervisor   0       6.5      ABC1000           10               
Grade supervisor   0       6.5      ABC1003           10    
Grade supervisor   0       12       ABC1294           23               

Как мне это сделать?

Ответы [ 3 ]

2 голосов
/ 26 мая 2019

Можно сгруппировать по «Student_ID», mutate «Кредитам» с max «Кредитов» и filter строк с «Appraisal.Type» в качестве «Супервайзера»

library(dplyr)
df1 %>%
   group_by(Student_ID) %>%
   dplyr::mutate(Credits = max(Credits)) %>%
   ungroup %>%
   filter(Appraisal.Type == "Grade supervisor")
# A tibble: 2 x 5
#  Appraisal.Type   Resits Credits Course_code Student_ID
#  <chr>             <int>   <dbl> <chr>            <int>
#1 Grade supervisor      0     6.5 ABC1000             10
#2 Grade supervisor      0     6.5 ABC1003             10

Если нам нужно, чтобы 'Course_code' был включен в группу

df2 %>%
  group_by(Student_ID, Course_code) %>% 
  dplyr::mutate(Credits = max(Credits)) %>%  
  filter(Appraisal.Type == "Grade supervisor")
# A tibble: 3 x 5
# Groups:   Student_ID, Course_code [3]
#  Appraisal.Type   Resits Credits Course_code Student_ID
#  <chr>             <int>   <dbl> <chr>            <int>
#1 Grade supervisor      0     6.5 ABC1000             10
#2 Grade supervisor      0     6.5 ABC1003             10
#3 Grade supervisor      0    12   ABC1294             23

ПРИМЕЧАНИЕ. В случае, если пакет plyr также загружен, возможна некоторая маскировка функций esp summarise/mutate, которая также содержится в plyr. Чтобы предотвратить это, сделайте это в новом сеансе без загрузки plyr или явно укажите dplyr::mutate

данные

df1 <- structure(list(Appraisal.Type = c("Final result", "Final result", 
"Grade supervisor", "Grade supervisor"), Resits = c(0L, 0L, 0L, 
0L), Credits = c(6.5, 6.5, 0, 0), Course_code = c("ABC1000", 
"ABC1003", "ABC1000", "ABC1003"), Student_ID = c(10L, 10L, 10L, 
10L)), class = "data.frame", row.names = c(NA, -4L)) 



df2 <- structure(list(Appraisal.Type = c("Final result", "Final result", 
"Grade supervisor", "Grade supervisor", "Final result", "Grade supervisor"
), Resits = c(0L, 0L, 0L, 0L, 0L, 0L), Credits = c(6.5, 6.5, 
0, 0, 12, 0), Course_code = c("ABC1000", "ABC1003", "ABC1000", 
"ABC1003", "ABC1294", "ABC1294"), Student_ID = c(10L, 10L, 10L, 
10L, 23L, 23L)), class = "data.frame", row.names = c(NA, -6L))
0 голосов
/ 26 мая 2019

Вот решение data.table,

DT[,Credits := max(Credits),by=Student_ID]
Result <- DT[Appraisal.Type == "Grade supervisor"]
0 голосов
/ 26 мая 2019

Создание образца набора данных.

data <- as.data.frame(list(Appraisal.Type = c(rep("Final result", 2), rep("Grade supervisor", 2)), 
                      Resits = rep(0, 4), 
                      Credits = c(rep(6.5, 2), rep(0, 2)), 
                      Course_code = rep(c("ABC1000", "ABC1003"), 2), 
                      Student_ID = rep(10, 4)))

Назначьте максимальное значение группы для всех строк в этой группе, а затем удалите строки, содержащие «Окончательные результаты».

##Reassign the values of "Credits" column
for (i in 1: nlevels(as.factor(data$Course_code))) {
  Course_code <- unique(data$Course_code)[i]
  data$Credits [data$Course_code == Course_code] <- max (data$Credits [data$Course_code == Course_code]) 
}
##New dataset without "Final result" rows
data <- data[data$Appraisal.Type != "Final result",]

Вот результат.

data
    Appraisal.Type Resits Credits Course_code Student_ID
3 Grade supervisor      0     6.5     ABC1000         10
4 Grade supervisor      0     6.5     ABC1003         10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...