library(RSQLite)
Desafio 08
unzip("database.sqlite3.zip", exdir = ".")
#tirando o zip
<- dbConnect(SQLite(), dbname = "database.sqlite3")
conn #abrindo a conexao
dbListTables(conn)
[1] "course_offerings" "courses" "grade_distributions"
[4] "instructors" "rooms" "schedules"
[7] "sections" "subject_memberships" "subjects"
[10] "teachings"
#vendo as tabelas
# Para ver colunas de uma tabela
dbListFields(conn, "subjects")
[1] "code" "name" "abbreviation"
###
dbListFields(conn, "course_offerings")
[1] "uuid" "course_uuid" "term_code" "name"
###
dbListFields(conn, "sections")
[1] "uuid" "course_offering_uuid" "section_type"
[4] "number" "room_uuid" "schedule_uuid"
###
dbListFields(conn, "instructors")
[1] "id" "name"
dbListFields(conn, "subject_memberships")
[1] "subject_code" "course_offering_uuid"
#vendo a coluna do subject membership
# pergunta 1
<- "
query SELECT DISTINCT i.name
FROM instructors i
JOIN teachings t ON i.id = t.instructor_id
JOIN sections s ON t.section_uuid = s.uuid
JOIN course_offerings co ON s.course_offering_uuid = co.uuid
JOIN subject_memberships sm ON co.uuid = sm.course_offering_uuid
JOIN subjects subj ON sm.subject_code = subj.code
WHERE subj.abbreviation = 'STAT'
"
# Define uma query SQL que seleciona os nomes distintos de professores (i.name)
# que deram aulas de disciplinas cujo assunto tem abreviação 'STAT'.
# Faz joins entre:
# instructors -> teachings -> sections -> course_offerings -> subject_memberships -> subjects
# para relacionar cada professor às disciplinas de estatística.
<- dbGetQuery(conn, query)
professores_stat # Executa a query no banco de dados conectado via 'conn' e salva o resultado
# no data.frame 'professores_stat'.
professores_stat
name
1 MINJING TAO
2 DONALD PORTER
3 SHENG WANG
4 KUNLING HUANG
5 DONG XIA
6 JENNIFER NGUYEN
7 SEULKEE YUN
8 DUZHE WANG
9 YONGFENG WU
10 JARED BROWN
11 YUCHEN ZHOU
12 VICTOR LUO
13 GUN WOONG PARK
14 BROOK LUERS
15 DUY NGUYEN
16 JOHN GILLETT
17 QUOC TRAN
18 YAOYAO XU
19 JIE ZHANG
20 LONG PHAN
21 WESLEY CHANG
22 TONG LI
23 SHANE HUBLER
24 FAN YANG
25 JU HEE CHO
26 JEEA CHOI
27 SHIXUE LIU
28 WEI-YIN LOH
29 BIN DAI
30 XIPEI YANG
31 DOUGLAS M. BATES
32 MICHAEL GEORGE ILTIS
33 LIAM JOHNSTON
34 CRYSTAL CHEN
35 YIFAN MEI
36 RUI CHEN
37 JILI WANG
38 LUWAN ZHANG
39 GINA BENNINGER
40 JIE SONG
41 XIWEN MA
42 HAODA FU
43 DEYUAN JIANG
44 JINGJIANG PENG
45 ERICA LEE DEADMAN
46 AKICHIKA OZEKI
47 MENG SONG
48 HAO TENG
49 DONGGYU KIM
50 COLIN LONGHURST
51 FREDERICK BOEHM
52 YONGSU LEE
53 GONZALO CONTADOR
54 HAO CHEN
55 XIN ZHANG
56 BO YANG
57 RUNGANG HAN
58 SEAN KENT
59 DEBRAJ DAS
60 YI LI
61 CLAIRE BOBST
62 CHAN PARK
63 SIJING LI
64 SHENGJI JIA
65 YUCHANG WU
66 ZHUANG WU
67 XIAOMAO LI
68 HYEBIN SONG
69 YOURAN QI
70 YOUNG MIN PARK
71 BIN ZHANG
72 QIURONG CUI
73 SEHO PARK
74 SHENG ZHANG
75 HUIKUN ZHANG
76 ALYSSA DIGILIO
77 YUQING XU
78 STEPHEN BERG
79 PEIGEN ZHOU
80 YAN CHEN
81 QIONG ZHANG
82 YOUNGDEOK HWANG
83 HAN CHEN
84 NICHOLAS STEPHEN KEULER
85 ZHENGXIAO WU
86 YUJIN CHUNG
87 WENWEN ZHANG
88 PERLA REYES
89 QI TANG
90 CHIA-CHIEH LIN
91 JIALE XU
92 YANG ZHAO
93 XINWEI DENG
94 MING XIE
95 JINGCI MENG
96 ISMOR FISCHER
97 JIAJIE CHEN
98 ZUOFENG SHANG
99 HAO ZHENG
100 XU XU
101 BIN ZHU
102 QUEFENG LI
103 YU QIU LIU
104 JUN LI
105 FAN GAO
106 VICTORIA MANSFIELD
107 ANQI SHI
108 KYLE HEBERT
109 XIUYU MA
110 CHENLIANG XU
111 CHANHAN HSU
112 YUANZHI LI
113 KAM-WAH TSUI
114 XINYU SONG
115 TIMOTHY IDOWU
116 XIAO NIE
117 CHEN CHENG
118 ANDREW LESLIE
119 YAOGUO XIE
120 KEVIN PACKARD
121 YI LIU
122 WENZHI CAO
123 JOSEPH DEUTSCH
124 LAN LUO
125 RYAN ZEA
126 ROBERT WARDROP
127 SANGBUM CHOI
128 XIN LI
129 SEUNGBONG HAN
130 ZHIGUO XIAO
131 RICHARD A. JOHNSON
132 RUI TANG
133 IAN BRANSTAD RILEY
134 BO HUANG
135 HEATHER MARIE BRAZEAU
136 XU HE
137 GARY HOWARD SCHROEDER
138 JUN ZHANG
139 CHENXI LI
140 SONA Z SWANSON
141 YUAN JIANG
142 JUNHEE HAN
143 LILUN DU
144 XIRAN WANG
145 ZIFENG ZHAO
146 CUIZE HAN
147 YING ZHANG
148 JOHN DAVIS
149 CHEN JING
150 JINGLAN LI
151 YI CHAI
152 THU LE
153 ALAN HUANG
154 HAOYANG FAN
155 BOWEN HU
156 TZU HSIANG HUNG
157 TUN LEE NG
158 ABIGAIL BENZINE
159 ALEXANDER COVINGTON
160 CHELSEY GREEN
161 MICHAEL KUTZLER
162 LILI ZHENG
163 REBECCA POST
164 LU YANG
165 RUOSI GUO
166 XUN ZHAO
167 MIN NIU
168 JIAN WU
169 WEI ZHENG
170 XINJIE HE
171 JIE WEI
172 CLAUDIA SOLIS LEMUS
173 XUEYAO CHEN
174 MANJUSHA KANCHARLA
175 MITCHELL PAUKNER
176 XIAOWU DAI
177 CHENGNING ZHANG
178 GINA OH
179 LUXI CAO
180 SONG WANG
181 LAM HO
182 TIEN VO
183 SHIZHEN WANG
184 SOHEIL SADEGHI
185 BINGYING XIE
186 GENG LI
187 JENNIFER BIRSTLER
188 MARIA KAMENETSKY
189 KYLE HERBET
190 JIANCHANG HU
191 TRAM TA
192 YUAN WANG
193 KAZUHIKO SHINKI
194 SIJIAN WANG
195 CHIEN-WEI CHEN
196 BEHZAD AALIPUR
197 DEREK BEAN
198 BEN ADAM HAALAND
199 ELOISA D CHAVAS
200 YALI WANG
201 VARSHA KULKARNI
202 SCOTT JOSEPH HETZEL
203 MIN JUNG LEE
204 FANG FANG
205 KRISTEN CYFFKA
206 TING-LI LIN
207 BRET LARGET
208 KATHERINE GOODE
209 ERIK NORDHEIM
210 NING FAN
211 ANRU ZHANG
212 GARVESH RASKUTTI
213 KRISHNAKUMAR BALASUBRAMANIAN
214 YAZHEN WANG
215 CHAOYANG YU
216 YILIN ZHANG
217 ZHENGJUN ZHANG
218 XIUFENG SHAO
219 YUAN LI
220 BRET HANLON
221 LILI LAN
222 CECILE ANE
223 ZHANG CHUNMING
224 LEI XU
225 MUHONG GAO
226 AUGUST JENSEN
227 XIAO GUO
228 THOMAS G. KURTZ
229 NICHOLAS HENDERSON
230 CHENSHENG KUANG
231 TAERI UHM
232 NORBERT BINKIEWICZ
233 KARL ROHE
234 JUNGWON MUN
235 JOSEP GINEBRA
236 TAO YU
237 XINXIN YU
238 HAO ZHOU
239 LIE XIONG
240 QIAN ZHIGUANG
241 SHANG WU
242 SHAN LU
243 STEPHEN AARON STANHOPE
244 LANCINE KONATE
245 GUILHERME VIEIRA NUNES LUDWIG
246 PAUL SAVARIAPPAN
247 CUICUI QI
248 KJELL DOKSUM
249 DEREK NORTON
250 KEEGAN KORTHAUER
251 KAILEI CHEN
252 THEVAASIINEN CHANDERENG
253 JOHN KANE
254 SOKOL VAKO
255 QING LI
256 YOUNG LEE
257 HYUNSEUNG KANG
258 BEHZAD AALIPUR HAFSHEJANI
259 SHULEI WANG
260 ZHONGJIE YU
261 LIN QI
262 JIWEI ZHAO
263 SUNDUZ KELES
264 SHUYUN YE
265 HUI WANG
266 KEVIN HASEGAWA ENG
267 XIAODAN WEI
268 MARIA ROJO
269 RUIFENG XU
270 YONGJOON KIM
271 NELLIE LAUGHLIN
272 MICHAEL HOGAN
273 KARL BROMAN
274 REBECCA KOSCIK
275 RONGJUN ZHU
276 BI CHENG WU
277 YUNONG LIN
278 ZHIGENG GENG
279 XIAOPING FENG
280 SHUANG HUANG
281 GUANNAN SUN
282 JEE YEON KIM
283 GREGORY SHINAULT
284 TONGHAI YANG
285 TIMO SEPPALAINEN
286 BENEDEK VALKO
287 DAVID GRIFFEATH
288 DAVID ANDERSON
289 PHILIP WOOD
290 FLORIAN BERTRAND
291 JASON RICHARD SWANSON
292 ALEXANDER KISELEV
293 SAMUEL STECHMANN
294 WAI TONG FAN
295 JUN YIN
296 STEFFEN LEMPP
297 RUIFANG SONG
298 JAMES D KUELBS
299 ANATOLE BECK
300 DONGHYUN LEE
301 ANDREJ ZLATOS
302 DANIELE CAPPELLETTI
303 MIHAELA IFRIM
304 SEBASTIEN ROCH
305 SCOTT HOTTOVY
306 JONATHON PETERSON
307 STEPHEN WAINGER
308 ALEXANDER FISH
309 GREGORIO MORENO-FLORES
310 SUKHENDU MEHROTRA
311 DIETRICH UHLENBROCK
312 LEV BORISOV
313 RICHARD A BRUALDI
314 ARNOLD MILLER
315 MATTHEW BALLARD
316 ALBRECHT KLEMM
317 PAUL M TERWILLIGER
318 STEVEN SAM
319 KEN ONO
320 ROBERT HARRON
321 YANNAN QIU
322 JOHN WILTSHIRE-GORDON
323 KYUNGMANN KIM
324 CHRISTOPHER WAGNER
325 PAUL RATHOUZ
326 STEPHEN WRIGHT
327 BENJAMIN RECHT
328 MICHAEL FERRIS
329 JESSE THOMAS HOLZER
330 HUILIN HU
331 ALBERTO DEL PIA
332 ROBERT R MEYER
333 SHI JIN
334 MARY LINDSTROM
335 ADIN-CRISTIAN ANDREI
336 MICHAEL LIOU
337 CHAOQUN MEI
338 CHRISTINA M. KENDZIORSKI
339 RONALD GANGNON
340 ROBERT WAYNE GREEN
341 COLE COOK
342 MURRAY CLAYTON
343 QI JIANG
344 JUN ZHU
345 ANNE BRUCKNER
346 TING YE
347 JUN SHAO
348 HUAIBAO FENG
349 ZIJIAN NI
350 THOMAS COOK
351 RICHARD J. CHAPPELL
352 MOO K CHUNG
353 MICHAEL NEWTON
354 BRIAN YANDELL
355 MICHELLE HARRIS
356 NORMAN DRAPER
357 YU MENGGANG
358 MING YUAN
359 FANGFANG WANG
360 JUNHO LEE
361 GRACE WAHBA
362 JASON P FINE
363 MICHAEL RENE KOSOROK
364 YAJUAN SI
365 LU MAO
366 DAVID DEMETS
367 JAMES ANDERSON
368 EDWARD ERKER
369 SHUAI CHEN
370 MARI PALTA
371 GUANHUA CHEN
372 SRIKANTHMADHAVAN ARAVAMUTHAN
373 NATALIA DE LEON GATTI
374 GUILHERME ROSA
375 YANBING ZHENG
376 CHRISTINE SORKNESS
377 MARIAN R FISHER
# Exibe o conteúdo de 'professores_stat', mostrando os nomes dos professores de STAT.
# Total de professores
nrow(professores_stat)
[1] 377
# Retorna o número de linhas do data.frame, ou seja, o total de professores distintos.
<- c("A"=4, "AB"=3.5, "B"=3, "BC"=2.5, "C"=2, "D"=1, "F"=0)
grade_values # Cria um vetor nomeado em R que associa cada nota em letra (A, AB, B, BC, C, D, F)
# ao seu valor numérico correspondente na escala americana de GPA (0 a 4).
dbListFields(conn, "grade_distributions")
[1] "course_offering_uuid" "section_number" "n_count"
[4] "c_count" "f_count" "cr_count"
[7] "p_count" "nw_count" "other_count"
[10] "bc_count" "u_count" "d_count"
[13] "ab_count" "a_count" "s_count"
[16] "i_count" "b_count" "nr_count"
# Lista todas as colunas existentes na tabela 'grade_distributions' do banco de dados
# conectado via 'conn', permitindo verificar quais campos estão disponíveis para consulta.
<- dbGetQuery(conn, "
grades_stat3 SELECT gd.course_offering_uuid,
gd.section_number,
gd.a_count, gd.ab_count, gd.b_count, gd.bc_count, gd.c_count, gd.d_count, gd.f_count,
t.instructor_id,
co.uuid AS course_offering_uuid,
co.course_uuid,
c.name AS course_name
FROM grade_distributions gd
JOIN sections s ON gd.section_number = s.number AND gd.course_offering_uuid = s.course_offering_uuid
JOIN teachings t ON s.uuid = t.section_uuid
JOIN course_offerings co ON s.course_offering_uuid = co.uuid
JOIN courses c ON co.course_uuid = c.uuid
JOIN subject_memberships sm ON co.uuid = sm.course_offering_uuid
JOIN subjects subj ON sm.subject_code = subj.code
WHERE subj.abbreviation = 'STAT'
")
# Executa uma query SQL no banco conectado via 'conn' e salva o resultado em 'grades_stat3'.
# A query faz o seguinte:
# - Seleciona o identificador do oferecimento (course_offering_uuid) e número da seção (section_number)
# - Seleciona a contagem de alunos por nota: a_count, ab_count, b_count, bc_count, c_count, d_count, f_count
# - Inclui o id do professor responsável (instructor_id)
# - Inclui o UUID do curso (co.uuid) e o UUID do curso real (co.course_uuid)
# - Inclui o nome do curso (course_name)
# - Faz joins entre grade_distributions -> sections -> teachings -> course_offerings -> courses
# -> subject_memberships -> subjects para relacionar cada nota à disciplina e professor
# - Filtra apenas as disciplinas cuja abreviação do assunto é 'STAT' (estatística)
<- c("a_count","ab_count","b_count","bc_count","c_count","d_count","f_count")
cols_count # Cria um vetor com os nomes das colunas que representam a contagem de alunos por cada nota.
<- lapply(grades_stat3[cols_count], as.numeric)
grades_stat3[cols_count] # Converte todas as colunas de contagem de notas em 'grades_stat3' para o tipo numérico,
# garantindo que cálculos matemáticos possam ser feitos corretamente.
<- nrow(grades_stat3)
n # Armazena o número de linhas (seções) em 'grades_stat3' na variável 'n'.
$total_students <- numeric(n)
grades_stat3$gpa <- numeric(n)
grades_stat3# Cria duas novas colunas em 'grades_stat3':
# - total_students: para armazenar o número total de alunos por seção
# - gpa: para armazenar o GPA médio da seção
<- c(4, 3.5, 3, 2.5, 2, 1, 0)
values # Define um vetor com os valores numéricos correspondentes às notas A, AB, B, BC, C, D, F
for(i in 1:n){
<- as.numeric(grades_stat3[i, cols_count])
counts # Para a linha i, extrai as contagens de alunos por nota e converte para numérico
$total_students[i] <- sum(counts)
grades_stat3# Calcula o total de alunos na seção i somando todas as contagens
$gpa[i] <- sum(counts * values) / grades_stat3$total_students[i]
grades_stat3# Calcula o GPA médio ponderado da seção i:
# multiplica cada contagem pelo valor numérico da nota, soma e divide pelo total de alunos
}
# Pegar nomes dos professores
<- dbGetQuery(conn, "SELECT id, name FROM instructors")
professores # Executa uma query no banco para obter os IDs e nomes de todos os professores,
# armazenando o resultado no data.frame 'professores'.
# GPA médio por professor
<- unique(grades_stat3$instructor_id)
prof_ids # Cria um vetor com os IDs únicos dos professores presentes em 'grades_stat3'.
<- data.frame(professor_id=prof_ids, gpa=NA, stringsAsFactors = FALSE)
gpa_prof # Cria um data.frame com uma coluna para os IDs dos professores e outra para o GPA médio,
# inicializando o GPA como NA.
for(i in seq_along(prof_ids)){
$gpa[i] <- mean(grades_stat3$gpa[grades_stat3$instructor_id == prof_ids[i]])
gpa_prof
}# Para cada professor, calcula a média do GPA das seções que ele lecionou
# e armazena no data.frame 'gpa_prof'.
# Juntar nomes
<- merge(gpa_prof, professores, by.x="professor_id", by.y="id", all.x=TRUE)
gpa_prof # Faz um merge entre 'gpa_prof' e 'professores' para adicionar os nomes
# correspondentes aos IDs, mantendo todos os professores de 'gpa_prof'.
# Professor mais difícil (menor GPA)
<- gpa_prof[which.min(gpa_prof$gpa), ]
prof_mais_dificil # Seleciona o(s) professor(es) com o menor GPA médio, ou seja, mais difícil.
# Professor mais fácil (maior GPA)
<- gpa_prof[which.max(gpa_prof$gpa), ]
prof_mais_facil # Seleciona o(s) professor(es) com o maior GPA médio, ou seja, mais fácil.
<- unique(grades_stat3$course_offering_uuid)
courses # Cria um vetor com os IDs únicos de cada oferecimento de disciplina presentes em 'grades_stat3'.
<- data.frame(course_offering_uuid=courses, gpa=NA, course_name=NA, stringsAsFactors = FALSE)
gpa_course # Cria um data.frame para armazenar o GPA médio e o nome de cada disciplina,
# inicializando gpa e course_name como NA.
for(i in seq_along(courses)){
<- which(grades_stat3$course_offering_uuid == courses[i])
idx # Para cada curso, encontra os índices das linhas em 'grades_stat3' correspondentes a esse curso.
$gpa[i] <- mean(grades_stat3$gpa[idx])
gpa_course# Calcula o GPA médio do curso i, com base nas seções encontradas, e armazena no data.frame.
$course_name[i] <- grades_stat3$course_name[idx][1] # pegar nome da disciplina
gpa_course# Atribui o nome da disciplina correspondente ao curso i,
# pegando o primeiro valor encontrado.
}
# Disciplina mais difícil (menor GPA)
<- gpa_course[which.min(gpa_course$gpa), ]
disc_mais_dificil # Seleciona a(s) disciplina(s) com o menor GPA médio, ou seja, a mais difícil.
# Disciplina mais fácil (maior GPA)
<- gpa_course[which.max(gpa_course$gpa), ]
disc_mais_facil # Seleciona a(s) disciplina(s) com o maior GPA médio, ou seja, a mais fácil.
#vendo empate
# Definir tolerância
<- 1e-6
tol # Define uma pequena tolerância para comparação de números decimais,
# evitando problemas com precisão de ponto flutuante ao comparar GPAs.
# Professores mais difíceis (menor GPA)
<- min(gpa_prof$gpa, na.rm=TRUE)
gpa_min # Calcula o menor GPA entre os professores, ignorando valores NA.
<- gpa_prof[abs(gpa_prof$gpa - gpa_min) < tol, ]
prof_mais_dificeis # Seleciona todos os professores cujo GPA está dentro da tolerância do menor GPA,
# considerando empates.
# Professores mais fáceis (maior GPA)
<- max(gpa_prof$gpa, na.rm=TRUE)
gpa_max # Calcula o maior GPA entre os professores, ignorando valores NA.
<- gpa_prof[abs(gpa_prof$gpa - gpa_max) < tol, ]
prof_mais_faceis # Seleciona todos os professores cujo GPA está dentro da tolerância do maior GPA,
# considerando empates.
# Disciplinas mais difíceis
<- min(gpa_course$gpa, na.rm=TRUE)
gpa_min_course # Calcula o menor GPA entre as disciplinas, ignorando valores NA.
<- gpa_course[abs(gpa_course$gpa - gpa_min_course) < tol, ]
disc_mais_dificeis # Seleciona todas as disciplinas cujo GPA está dentro da tolerância do menor GPA,
# considerando empates.
# Disciplinas mais fáceis
<- max(gpa_course$gpa, na.rm=TRUE)
gpa_max_course # Calcula o maior GPA entre as disciplinas, ignorando valores NA.
<- gpa_course[abs(gpa_course$gpa - gpa_max_course) < tol, ]
disc_mais_faceis # Seleciona todas as disciplinas cujo GPA está dentro da tolerância do maior GPA,
# considerando empates.
# GPA mínimo e máximo dos professores, ignorando NAs
<- min(gpa_prof$gpa, na.rm = TRUE)
gpa_min # Calcula o menor GPA entre os professores, ignorando valores NA.
<- max(gpa_prof$gpa, na.rm = TRUE)
gpa_max # Calcula o maior GPA entre os professores, ignorando valores NA.
# Professores mais difíceis (menor GPA)
<- gpa_prof[!is.na(gpa_prof$gpa) & abs(gpa_prof$gpa - gpa_min) < 1e-6, ]
prof_mais_dificeis # Seleciona todos os professores cujo GPA não é NA e está dentro da tolerância
# do menor GPA, garantindo que empates e valores válidos sejam considerados.
# Professores mais fáceis (maior GPA)
<- gpa_prof[!is.na(gpa_prof$gpa) & abs(gpa_prof$gpa - gpa_max) < 1e-6, ]
prof_mais_faceis # Seleciona todos os professores cujo GPA não é NA e está dentro da tolerância
# do maior GPA, garantindo que empates e valores válidos sejam considerados.
# Remover NAs e repetições nos nomes
<- unique(na.omit(prof_mais_dificeis$name))
prof_mais_dificeis_names # Remove quaisquer valores NA e repetições dos nomes dos professores mais difíceis.
<- unique(na.omit(prof_mais_faceis$name))
prof_mais_faceis_names # Remove quaisquer valores NA e repetições dos nomes dos professores mais fáceis.
<- unique(na.omit(disc_mais_dificeis$course_name))
disc_mais_dificeis_names # Remove quaisquer valores NA e repetições dos nomes das disciplinas mais difíceis.
# Mostrar resultados
cat("Professor(es) mais difícil(is):", paste(prof_mais_dificeis_names, collapse=", "),
"com GPA médio =", round(prof_mais_dificeis$gpa[1],2), "\n")
Professor(es) mais difícil(is): JAMES D KUELBS com GPA médio = 2.64
# Exibe os nomes dos professores mais difíceis, separados por vírgula,
# junto com o GPA médio arredondado a duas casas decimais.
cat("Professor(es) mais fácil(is):", paste(prof_mais_faceis_names, collapse=", "),
"com GPA médio =", round(prof_mais_faceis$gpa[1],2), "\n")
Professor(es) mais fácil(is): SRIKANTHMADHAVAN ARAVAMUTHAN, GUANHUA CHEN com GPA médio = 4
# Exibe os nomes dos professores mais fáceis, separados por vírgula,
# junto com o GPA médio arredondado a duas casas decimais.
cat("Disciplina(s) mais difícil(is):", paste(disc_mais_dificeis_names, collapse=", "),
"com GPA médio =", round(disc_mais_dificeis$gpa[1],2), "\n")
Disciplina(s) mais difícil(is): Introduction to Stochastic Processes com GPA médio = 2.44
# Exibe os nomes das disciplinas mais difíceis, separados por vírgula,
# junto com o GPA médio arredondado a duas casas decimais.
# Criar tabela de GPA médio por disciplina (agrupando pelo nome da disciplina)
<- grades_stat3[!is.na(grades_stat3$gpa), ]
grades_stat3_valid
<- aggregate(gpa ~ course_name, data=grades_stat3_valid, FUN=function(x) mean(x, na.rm=TRUE))
gpa_course_final
# GPA máximo entre todas as disciplinas
<- max(gpa_course_final$gpa, na.rm = TRUE)
gpa_max_course
# Selecionar apenas disciplina(s) mais fácil(is)
<- gpa_course_final[gpa_course_final$gpa == gpa_max_course, ]
disc_mais_faceis
# Mostrar resultados
cat("Disciplina(s) mais fácil(is):", paste(disc_mais_faceis$course_name, collapse=", "), "\n")
Disciplina(s) mais fácil(is): Data Science Practicum, Empir Proc&Semiparmtrc Infernc, Nonparametric Statistics and Machine Learning Methods, Sample Survey Theory and Method
# Criar tabela de GPA médio por disciplina (agrupando pelo nome da disciplina)
<- aggregate(gpa ~ course_name, data=grades_stat3_valid, FUN=function(x) mean(x, na.rm=TRUE))
gpa_course_final
# GPA máximo entre todas as disciplinas
<- max(gpa_course_final$gpa, na.rm = TRUE)
gpa_max_course
# Selecionar apenas disciplina(s) mais fácil(is)
<- gpa_course_final[gpa_course_final$gpa == gpa_max_course, ]
disc_mais_faceis
# Mostrar resultados
cat("Disciplina(s) mais fácil(is):", paste(disc_mais_faceis$course_name, collapse=", "), "\n")
Disciplina(s) mais fácil(is): Data Science Practicum, Empir Proc&Semiparmtrc Infernc, Nonparametric Statistics and Machine Learning Methods, Sample Survey Theory and Method
#calculando quando o html foi gerado
cat(paste0("Este HTML foi gerado em: ", Sys.time()))
Este HTML foi gerado em: 2025-09-24 17:26:44.304889
dbDisconnect(conn)