The Impacts of COVID-19 Pandemic on Graduation and Fall Enrollment:
Results from a National Study of Undergraduate and Graduate Students in Engineering

Engineering Students - Background Characteristics

# Degree level
studata<-studata%>%
  filter(degree>0)%>%
  mutate(degree=as.factor(degree))

studata$degree<-recode(studata$degree, 
                     `1`="Bachelor", 
                     `2`="Master", 
                     `3`="Doctorate")

kable(addmargins(table(studata$degree), FUN = list(Total=sum)), "pandoc",
      caption = "Degree level (n)", align = "lc")
Degree level (n)
Var1 Freq
Bachelor 2617
Master 545
Doctorate 283
Total 3445
kable(addmargins(round(prop.table(table(studata$degree))*100, 1), FUN = list(Total=sum)), "pandoc",
      caption = "Degree level (%)", align = "lc")
Degree level (%)
Var1 Freq
Bachelor 76.0
Master 15.8
Doctorate 8.2
Total 100.0
# Gender
studata<-studata%>%
  mutate(gender=9)

studata$gender<-ifelse(studata$gender_1==1, 1, studata$gender)
studata$gender<-ifelse(studata$gender_2==1, 0, studata$gender)
studata$gender<-ifelse(studata$gender_3==1 | studata$gender_4==1 | studata$gender_5==1 | studata$gender_6==1, 3, studata$gender)
studata$gender<-ifelse(studata$gender==9, NA, studata$gender)

studata$gender<-recode(studata$gender, 
                     `1`="Male",
                     `0`="Female",
                     `3`="Other")

studata$gender<-as.factor(studata$gender)
studata$gender<-ordered(studata$gender, levels=c("Male", "Female", "Other"))

# Total
kable(addmargins(table(studata$gender), FUN = list(Total=sum)), "pandoc",
      caption = "Gender (n)", align = "c")
Gender (n)
Var1 Freq
Male 1211
Female 993
Other 36
Total 2240
tabgen<-table(studata$gender)
kable(addmargins(round(prop.table(tabgen)*100, 1), FUN = list(Total=sum)), "pandoc", 
      caption = "Gender (%)", align = "c")
Gender (%)
Var1 Freq
Male 54.1
Female 44.3
Other 1.6
Total 100.0
# By degree
kable(addmargins(table(studata$gender, studata$degree), FUN = list(Total=sum)), "pandoc",
      caption = "Students gender by degree level (n)", align = "c")
## Margins computed over dimensions
## in the following order:
## 1: 
## 2:
Students gender by degree level (n)
Bachelor Master Doctorate Total
Male 895 200 116 1211
Female 752 144 97 993
Other 26 6 4 36
Total 1673 350 217 2240
tabgen2<-table(studata$gender, studata$degree)
kable(addmargins(round(prop.table(tabgen2, 2)*100, 1), FUN = list(Total=sum), 1), "pandoc", 
      caption = "Students gender by degree level (n) (%)", align = "c")
Students gender by degree level (n) (%)
Bachelor Master Doctorate
Male 53.5 57.1 53.5
Female 44.9 41.1 44.7
Other 1.6 1.7 1.8
Total 100.0 99.9 100.0
# Race and Ethnicity
studata<-studata%>%
  mutate(hispanic=ifelse(hisp_1 !=1 & (hisp_2==1 | hisp_3==1 | hisp_4==1 | hisp_5==1), 1, 0))%>%
  mutate(nhw=ifelse(hispanic==0 & race_1==1 & race_2==0 & race_3==0 & race_4==0 & race_5==0 & race_6==0, 1, 0), 
         nhb=ifelse(hispanic==0 & race_2==1 & race_1==0 & race_3==0 & race_4==0 & race_5==0 & race_6==0, 1, 0),
         nha=ifelse(hispanic==0 & race_3==1 & race_2==0 & race_1==0 & race_4==0 & race_5==0 & race_6==0, 1, 0),
         nhna=ifelse(hispanic==0 & (race_4==1 | race_5==1) & race_1==0 & race_2==0 & race_3==0 & race_6==0, 1, 0),
         nho=ifelse(hispanic==0 & race_6==1 & race_2==0 & race_3==0 & race_4==0 & race_5==0 & race_1==0, 1, 0))%>%
  mutate(nhm=ifelse(hispanic==0 & (nhw==0 & nha==0 & nhb==0 & nhna==0), 1 , 0))%>%
  mutate(raceethn=ifelse(nhw==1, 1, 9), 
         raceethn=ifelse(nha==1, 2, raceethn), 
         raceethn=ifelse(hispanic==1, 3, raceethn), 
         raceethn=ifelse(nhb==1, 4, raceethn),
         raceethn=ifelse(nhna==1, 5, raceethn),
         raceethn=ifelse(nhm==1, 6, raceethn),
         raceethn=ifelse(nho==1, 7, raceethn))

studata$raceethn<-recode(studata$raceethn, 
                       `1`="White, non-Hispanic",
                       `2`="Asian, non-Hispanic",
                       `3`="Hispanic",
                       `4`="Black, non-Hispanic",
                       `5`="Native American, non-Hispanic", 
                       `6`="Multirace, non-Hispanic",
                       `7`="Other race/ethnicity")

studata$raceethn<-as.factor(studata$raceethn)
studata$raceethn<-ordered(studata$raceethn, levels=c("White, non-Hispanic", "Asian, non-Hispanic", "Hispanic", "Black, non-Hispanic", "Native American, non-Hispanic", "Multirace, non-Hispanic", "Other race/ethnicity"))

# Total
kable(addmargins(table(studata$raceethn), FUN = list(Total=sum)), "pandoc",
      caption = "Students race and ethnicity (n)", align = "lc")
Students race and ethnicity (n)
Var1 Freq
White, non-Hispanic 1164
Asian, non-Hispanic 543
Hispanic 316
Black, non-Hispanic 65
Native American, non-Hispanic 8
Multirace, non-Hispanic 108
Other race/ethnicity 52
Total 2256
tabrace<-table(studata$raceethn)
kable(addmargins(round(prop.table(tabrace)*100, 1), FUN = list(Total=sum)), "pandoc",
      caption = "Students race and ethnicity (%)", align = "lc")
Students race and ethnicity (%)
Var1 Freq
White, non-Hispanic 51.6
Asian, non-Hispanic 24.1
Hispanic 14.0
Black, non-Hispanic 2.9
Native American, non-Hispanic 0.4
Multirace, non-Hispanic 4.8
Other race/ethnicity 2.3
Total 100.1
# By degree
kable(addmargins(table(studata$raceethn, studata$degree), FUN = list(Total=sum)), "pandoc",
      caption = "Students race and ethnicity by degree (n)", align = "c")
## Margins computed over dimensions
## in the following order:
## 1: 
## 2:
Students race and ethnicity by degree (n)
Bachelor Master Doctorate Total
White, non-Hispanic 939 101 124 1164
Asian, non-Hispanic 310 180 53 543
Hispanic 258 36 22 316
Black, non-Hispanic 44 12 9 65
Native American, non-Hispanic 6 2 0 8
Multirace, non-Hispanic 86 13 9 108
Other race/ethnicity 39 10 3 52
Total 1682 354 220 2256
tabrace2<-table(studata$raceethn, studata$degree)
kable(addmargins(round(prop.table(tabrace2, 2)*100, 1), FUN = list(Total=sum), 1), "pandoc",
      caption = "Students race and ethnicity by degree (%)", align = "c")
Students race and ethnicity by degree (%)
Bachelor Master Doctorate
White, non-Hispanic 55.8 28.5 56.4
Asian, non-Hispanic 18.4 50.8 24.1
Hispanic 15.3 10.2 10.0
Black, non-Hispanic 2.6 3.4 4.1
Native American, non-Hispanic 0.4 0.6 0.0
Multirace, non-Hispanic 5.1 3.7 4.1
Other race/ethnicity 2.3 2.8 1.4
Total 99.9 100.0 100.1
# Age
studata<-studata%>%
  mutate(yrbirth=ifelse(age>-3, 2000-age, NA))%>%
  mutate(aged=2020-yrbirth)%>%
  mutate(aged=as.double(aged))

describe(studata$aged)
describe.by(studata$aged, studata$degree)
## 
##  Descriptive statistics by group 
## group: Bachelor
##    vars    n  mean   sd median trimmed  mad min max range skew kurtosis  se
## X1    1 1659 21.39 4.06     21   20.79 1.48  18 100    82 9.89   157.81 0.1
## ------------------------------------------------------------ 
## group: Master
##    vars   n  mean   sd median trimmed  mad min max range skew kurtosis   se
## X1    1 348 26.83 6.38     25   25.62 2.97  18  71    53 2.96    11.91 0.34
## ------------------------------------------------------------ 
## group: Doctorate
##    vars   n  mean   sd median trimmed  mad min max range skew kurtosis  se
## X1    1 212 27.67 4.39     27   27.02 2.97  22  57    35  2.7    11.75 0.3
# Immigration
studata<-studata%>%
  mutate(immig=0)

studata$immig<-recode(studata$immistu,
                      `1`="US citizen",
                      `2`="Permanent resident",
                      `3`="Temporary, non-immigrant, student visa holder",
                      `4`="None of the above")

studata$immig<-ordered(studata$immig, levels = c("US citizen",
                                                 "Permanent resident",
                                                 "Temporary, non-immigrant, student visa holder",
                                                 "None of the above"))

# Total
kable(addmargins(table(studata$immig), FUN = list(Total=sum)), "pandoc",
      caption = "Students immigration status (n)", align = "lc")
Students immigration status (n)
Var1 Freq
US citizen 1878
Permanent resident 46
Temporary, non-immigrant, student visa holder 285
None of the above 16
Total 2225
tabimmst<-table(studata$immig)
kable(round(addmargins(prop.table(tabimmst)*100, 1, FUN = list(Total=sum)), 1), "pandoc",
      caption = "Students immigration status (%)", align = "lc")
Students immigration status (%)
Var1 Freq
US citizen 84.4
Permanent resident 2.1
Temporary, non-immigrant, student visa holder 12.8
None of the above 0.7
Total 100.0
#By degree
kable(addmargins(table(studata$immig, studata$degree), FUN = list(Total=sum)), "pandoc",
      caption = "Students immigration status by degree (n)", align = "c")
## Margins computed over dimensions
## in the following order:
## 1: 
## 2:
Students immigration status by degree (n)
Bachelor Master Doctorate Total
US citizen 1556 176 146 1878
Permanent resident 31 11 4 46
Temporary, non-immigrant, student visa holder 65 159 61 285
None of the above 12 3 1 16
Total 1664 349 212 2225
tabimmst2<-table(studata$immig, studata$degree)
kable(round(addmargins(prop.table(tabimmst2, 2)*100, 1, FUN = list(Total=sum)), 1), "pandoc",
      caption = "Students immigration status by degree (%)", align = "c")
Students immigration status by degree (%)
Bachelor Master Doctorate
US citizen 93.5 50.4 68.9
Permanent resident 1.9 3.2 1.9
Temporary, non-immigrant, student visa holder 3.9 45.6 28.8
None of the above 0.7 0.9 0.5
Total 100.0 100.0 100.0

1. How many students plan to enroll in the Fall 2020?

studata<-studata%>%
  mutate(fall20=ifelse(enrfall==2, NA, enrfall))

studata$fall20<-recode(studata$fall20, 
                     `1`="I will enroll as planned before the COVID-19 outbreak",
                     `3`="I will NOT enroll but not because of the COVID-19 outbreak",
                     `4`="I will NOT enroll because I changed my mind due to COVID-19",
                     `5`="I have not decided yet")

studata$fall20<-ordered(studata$fall20, levels = c("I will enroll as planned before the COVID-19 outbreak",
                                                 "I have not decided yet",
                                                 "I will NOT enroll because I changed my mind due to COVID-19",
                                                 "I will NOT enroll but not because of the COVID-19 outbreak"))

# Total
kable(addmargins(table(studata$fall20), FUN = list(Total=sum)), "pandoc",
      caption = "Decision to enroll in the fall 2020 (n)", align = "lc")
Decision to enroll in the fall 2020 (n)
Var1 Freq
I will enroll as planned before the COVID-19 outbreak 2600
I have not decided yet 253
I will NOT enroll because I changed my mind due to COVID-19 18
I will NOT enroll but not because of the COVID-19 outbreak 26
Total 2897
tabfall20<-table(studata$fall20)
kable(round(addmargins(prop.table(tabfall20)*100, 1, FUN = list(Total=sum)), 1), "pandoc",
      caption = "Decision to enroll in the fall 2020 (%)", align = "lc")
Decision to enroll in the fall 2020 (%)
Var1 Freq
I will enroll as planned before the COVID-19 outbreak 89.7
I have not decided yet 8.7
I will NOT enroll because I changed my mind due to COVID-19 0.6
I will NOT enroll but not because of the COVID-19 outbreak 0.9
Total 100.0
# By degree - Excluding item 2
kable(addmargins(table(studata$fall20, studata$degree), FUN = list(Total=sum)), "pandoc",
      caption = "Decision to enroll in the fall 2020 by degree (n)", align = "c")
## Margins computed over dimensions
## in the following order:
## 1: 
## 2:
Decision to enroll in the fall 2020 by degree (n)
Bachelor Master Doctorate Total
I will enroll as planned before the COVID-19 outbreak 2002 357 241 2600
I have not decided yet 198 45 10 253
I will NOT enroll because I changed my mind due to COVID-19 12 6 0 18
I will NOT enroll but not because of the COVID-19 outbreak 19 4 3 26
Total 2231 412 254 2897
tabfall202<-table(studata$fall20, studata$degree)
kable(round(addmargins(prop.table(tabfall202, 2)*100, 1, FUN = list(Total=sum)), 1), "pandoc",
      caption = "Decision to enroll in the fall 2020 by degree (%)", align = "c")
Decision to enroll in the fall 2020 by degree (%)
Bachelor Master Doctorate
I will enroll as planned before the COVID-19 outbreak 89.7 86.7 94.9
I have not decided yet 8.9 10.9 3.9
I will NOT enroll because I changed my mind due to COVID-19 0.5 1.5 0.0
I will NOT enroll but not because of the COVID-19 outbreak 0.9 1.0 1.2
Total 100.0 100.0 100.0

Figure 1

studata$fall20<-ordered(studata$fall20, levels = c("I will NOT enroll but not because of the COVID-19 outbreak",
                                                   "I will NOT enroll because I changed my mind due to COVID-19",
                                                   "I have not decided yet",
                                                   "I will enroll as planned before the COVID-19 outbreak"))

fig_enroll_degree<-studata%>%
  filter(!is.na(fall20))%>%
  ggplot()+
  geom_bar(aes(x=degree, y=..count../sum(..count..), fill=fall20), 
           width = 0.6, 
           position = "fill", 
           colour ="black")+
  scale_x_discrete(na.translate=F, labels = c("Bachelor", "Master", "Doctorate"))+
  scale_y_continuous(labels = percent, limits = c(0, 1), breaks = seq(0, 1, .2))+
  guides(fill=guide_legend(title = NULL, reverse = T))+
  labs(x="Degree Level", 
       y=NULL,
       caption = NULL)+
  scale_fill_brewer("#0c0996", 
                    labels = c("I will NOT enroll\nbut not because of\nthe COVID-19 outbreak",
                               "I will NOT enroll\nbecause I changed my\nmind due to COVID-19",
                               "I have not\ndecided yet",
                               "I will enroll as\nplanned before the\nCOVID-19 outbreak"), 
                    direction = 1)+
  theme_classic()+
  theme(legend.position = "bottom", 
        legend.background = element_rect(linetype = "blank") ,
        axis.text.x = element_text(size = 9, face = "bold"),
        axis.title.x = element_text(size = 10, face = "bold"),
        axis.title.y = element_text(size = 9, angle = 0, vjust = .5, face = "bold"),
        legend.text = element_text(size = 8), 
        plot.caption= element_text(size = 7))

fig_enroll_degree

2. How many students delayed their graduation due to the COVID-19 pandemic?

studata<-studata%>%
  mutate(delay=if_else(dimpact==1, 1, 0))

studata$delay<-recode(studata$delay, `1`="Yes, COVID-19 outbreak delay mi graduation date", `0`="No, COVID-19 outbreak did not delay mi graduation date")
studata$delay<-ordered(studata$delay, levels = c("Yes, COVID-19 outbreak delay mi graduation date", "No, COVID-19 outbreak did not delay mi graduation date"))

# Total
kable(addmargins(table(studata$delay), FUN = list(Total=sum)), "pandoc",
      caption = "Delay graduation date (n)", align = "lc")
Delay graduation date (n)
Var1 Freq
Yes, COVID-19 outbreak delay mi graduation date 348
No, COVID-19 outbreak did not delay mi graduation date 2789
Total 3137
tab2st<-table(studata$delay)
kable(round(addmargins(prop.table(tab2st)*100, 1, FUN = list(Total=sum)), 1), "pandoc",
      caption = "Delay graduation date (%)", align = "lc")
Delay graduation date (%)
Var1 Freq
Yes, COVID-19 outbreak delay mi graduation date 11.1
No, COVID-19 outbreak did not delay mi graduation date 88.9
Total 100.0
# By degree
kable(addmargins(table(studata$delay, studata$degree), FUN = list(Total=sum)), "pandoc",
      caption = "Delay graduation date by degree (n)", align = "c")
## Margins computed over dimensions
## in the following order:
## 1: 
## 2:
Delay graduation date by degree (n)
Bachelor Master Doctorate Total
Yes, COVID-19 outbreak delay mi graduation date 168 81 99 348
No, COVID-19 outbreak did not delay mi graduation date 2209 412 168 2789
Total 2377 493 267 3137
tab2.2st<-table(studata$delay, studata$degree)
kable(round(addmargins(prop.table(tab2.2st, 2)*100, 1, FUN = list(Total=sum)), 1), "pandoc",
      caption = "Delay graduation date by degree (%)", align = "c")
Delay graduation date by degree (%)
Bachelor Master Doctorate
Yes, COVID-19 outbreak delay mi graduation date 7.1 16.4 37.1
No, COVID-19 outbreak did not delay mi graduation date 92.9 83.6 62.9
Total 100.0 100.0 100.0

Figure 2

fig_delay_degree<-studata%>%
  filter(!is.na(delay))%>%
  ggplot()+
  geom_bar(aes(x=degree, fill=delay, y=(..count../sum(..count..))), 
           width = 0.6, 
           position = "fill", 
           colour ="black")+
  scale_x_discrete(na.translate=F)+
  scale_y_continuous(labels = percent)+
  guides(fill=guide_legend(title = NULL))+
  labs(x="Degree Level", 
       y=NULL,
       caption = NULL)+
  scale_fill_brewer(palette = "Paired", 
                    labels=c("Yes", "No"), 
                    direction = -1)+
  theme_classic()+
  theme(legend.position = "bottom", 
        legend.background = element_rect(linetype = "blank") ,
        axis.text.x = element_text(size = 9),
        axis.title = element_text(size = 10, face = "bold"),
        legend.text = element_text(size = 9), 
        plot.caption= element_text(size = 7))

fig_delay_degree

3. What are the reasons for potentially not enrolling in the Fall 2020?

studata$noenroll1<-ifelse(studata$noterl_1==1, 1, 0)
studata$noenroll2<-ifelse(studata$noterl_2==1, 1, 0)
studata$noenroll3<-ifelse(studata$noterl_3==1, 1, 0)
studata$noenroll4<-ifelse(studata$noterl_4==1, 1, 0)
studata$noenroll5<-ifelse(studata$noterl_5==1, 1, 0)
studata$noenroll6<-ifelse(studata$noterl_6==1, 1, 0)
studata$noenroll7<-ifelse(studata$noterl_7==1, 1, 0)
studata$noenroll8<-ifelse(studata$noterl_8==1, 1, 0)

studata$noenroll1<-recode(studata$noenroll1, `1`="Yes", `0`= "No")
studata$noenroll2<-recode(studata$noenroll2, `1`="Yes", `0`= "No")
studata$noenroll3<-recode(studata$noenroll3, `1`="Yes", `0`= "No")
studata$noenroll4<-recode(studata$noenroll4, `1`="Yes", `0`= "No")
studata$noenroll5<-recode(studata$noenroll5, `1`="Yes", `0`= "No")
studata$noenroll6<-recode(studata$noenroll6, `1`="Yes", `0`= "No")
studata$noenroll7<-recode(studata$noenroll7, `1`="Yes", `0`= "No")
studata$noenroll8<-recode(studata$noenroll8, `1`="Yes", `0`= "No")

studata$noenroll1<-as.factor(studata$noenroll1)
studata$noenroll2<-as.factor(studata$noenroll2)
studata$noenroll3<-as.factor(studata$noenroll3)
studata$noenroll4<-as.factor(studata$noenroll4)
studata$noenroll5<-as.factor(studata$noenroll5)
studata$noenroll6<-as.factor(studata$noenroll6)
studata$noenroll7<-as.factor(studata$noenroll7)
studata$noenroll8<-as.factor(studata$noenroll8)

studata$noenroll1<-ordered(studata$noenroll1, levels = c("Yes", "No"))
studata$noenroll2<-ordered(studata$noenroll2, levels = c("Yes", "No"))
studata$noenroll3<-ordered(studata$noenroll3, levels = c("Yes", "No"))
studata$noenroll4<-ordered(studata$noenroll4, levels = c("Yes", "No"))
studata$noenroll5<-ordered(studata$noenroll5, levels = c("Yes", "No"))
studata$noenroll6<-ordered(studata$noenroll6, levels = c("Yes", "No"))
studata$noenroll7<-ordered(studata$noenroll7, levels = c("Yes", "No"))
studata$noenroll8<-ordered(studata$noenroll8, levels = c("Yes", "No"))

# Total
kable(addmargins(table(studata$noenroll1), FUN = list(Total=sum)), "pandoc",
      caption = "Risk to my health and safety at the current institution/city (n)", align = "lc")
Risk to my health and safety at the current institution/city (n)
Var1 Freq
Yes 105
No 165
Total 270
tabnoen1<-table(studata$noenroll1)
kable(round(addmargins(prop.table(tabnoen1)*100, FUN = list(Total=sum)), 1), "pandoc",
      caption = "Risk to my health and safety at the current institution/city (%)", align = "lc")
Risk to my health and safety at the current institution/city (%)
Var1 Freq
Yes 38.9
No 61.1
Total 100.0
kable(addmargins(table(studata$noenroll2), FUN = list(Total=sum)), "pandoc",
      caption = "Loss of income from the current institution/city (n)", align = "lc")
Loss of income from the current institution/city (n)
Var1 Freq
Yes 42
No 228
Total 270
tabnoen2<-table(studata$noenroll2)
kable(round(addmargins(prop.table(tabnoen2)*100, FUN = list(Total=sum)), 1), "pandoc",
      caption = "Loss of income from the current institution/city (%)", align = "lc")
Loss of income from the current institution/city (%)
Var1 Freq
Yes 15.6
No 84.4
Total 100.0
kable(addmargins(table(studata$noenroll3), FUN = list(Total=sum)), "pandoc",
      caption = "Uncertainty about financial support for the fall semester (n)", align = "lc")
Uncertainty about financial support for the fall semester (n)
Var1 Freq
Yes 104
No 166
Total 270
tabnoen3<-table(studata$noenroll3)
kable(round(addmargins(prop.table(tabnoen3)*100, FUN = list(Total=sum)), 1), "pandoc",
      caption = "Uncertainty about financial support for the fall semester (%)", align = "lc")
Uncertainty about financial support for the fall semester (%)
Var1 Freq
Yes 38.5
No 61.5
Total 100.0
kable(addmargins(table(studata$noenroll4), FUN = list(Total=sum)), "pandoc",
      caption = "Want to save money (n)", align = "lc")
Want to save money (n)
Var1 Freq
Yes 72
No 198
Total 270
tabnoen4<-table(studata$noenroll4)
kable(round(addmargins(prop.table(tabnoen4)*100, FUN = list(Total=sum)), 1), "pandoc",
      caption = "Want to save money (%)", align = "lc")
Want to save money (%)
Var1 Freq
Yes 26.7
No 73.3
Total 100.0
kable(addmargins(table(studata$noenroll5), FUN = list(Total=sum)), "pandoc",
      caption = "Will move back to be closer with family (n)", align = "lc")
Will move back to be closer with family (n)
Var1 Freq
Yes 12
No 258
Total 270
tabnoen5<-table(studata$noenroll5)
kable(round(addmargins(prop.table(tabnoen5)*100, FUN = list(Total=sum)), 1), "pandoc",
      caption = "Will move back to be closer with family (%)", align = "lc")
Will move back to be closer with family (%)
Var1 Freq
Yes 4.4
No 95.6
Total 100.0
kable(addmargins(table(studata$noenroll6), FUN = list(Total=sum)), "pandoc",
      caption = "Will transfer to another institution (n)", align = "lc")
Will transfer to another institution (n)
Var1 Freq
Yes 16
No 254
Total 270
tabnoen6<-table(studata$noenroll6)
kable(round(addmargins(prop.table(tabnoen6)*100, FUN = list(Total=sum)), 1), "pandoc",
      caption = "Will transfer to another institution (%)", align = "lc")
Will transfer to another institution (%)
Var1 Freq
Yes 5.9
No 94.1
Total 100.0
kable(addmargins(table(studata$noenroll7), FUN = list(Total=sum)), "pandoc",
      caption = "Will transfer to another program (n)", align = "lc")
Will transfer to another program (n)
Var1 Freq
Yes 6
No 264
Total 270
tabnoen7<-table(studata$noenroll7)
kable(round(addmargins(prop.table(tabnoen7)*100, FUN = list(Total=sum)), 1), "pandoc",
      caption = "Will transfer to another program (%)", align = "lc")
Will transfer to another program (%)
Var1 Freq
Yes 2.2
No 97.8
Total 100.0
kable(addmargins(table(studata$noenroll8), FUN = list(Total=sum)), "pandoc",
      caption = "Other (n)", align = "lc")
Other (n)
Var1 Freq
Yes 103
No 167
Total 270
tabnoen8<-table(studata$noenroll8)
kable(round(addmargins(prop.table(tabnoen8)*100, FUN = list(Total=sum)), 1), "pandoc",
      caption = "Other reason (%)", align = "lc")
Other reason (%)
Var1 Freq
Yes 38.1
No 61.9
Total 100.0

4. What is the preferred instruction mode for the Fall 2020?

studata<-studata%>%
  mutate(fallopen1=ifelse(is.na(fallopen_1), fallopenr2_1, fallopen_1), 
         fallopen2=ifelse(is.na(fallopen_2), fallopenr2_2, fallopen_2))

# Recode fallopen variables
studata$fallopen1<-recode(studata$fallopen1, `1`="Face-to-Face", `2`="Online", `3`="Mix Mode")

# Ordered levels
studata$fallopen1<-ordered(studata$fallopen1, levels = c("Face-to-Face", "Online", "Mix Mode"))

# Total - fallopen1
kable(addmargins(table(studata$fallopen1), FUN = list(Total=sum)), "pandoc", 
      caption = "Preferred approach for Attending classes/seminars (n)", align = "lc")
Preferred approach for Attending classes/seminars (n)
Var1 Freq
Face-to-Face 668
Online 536
Mix Mode 1006
Total 2210
tabfallopen1<-table(studata$fallopen1)
kable(addmargins(round(prop.table(tabfallopen1)*100, 1), 1, FUN = list(Total=sum)), "pandoc", 
      caption = "Preferred approach for Attending classes/seminars (%)", align = "lc")
Preferred approach for Attending classes/seminars (%)
Var1 Freq
Face-to-Face 30.2
Online 24.3
Mix Mode 45.5
Total 100.0
# By degree - fallopen1
kable(addmargins(table(studata$fallopen1, studata$degree), FUN = list(Total=sum)), "pandoc", 
      caption = "Preferred approach for Attending classes/seminars by degree (n)", align = "c")
## Margins computed over dimensions
## in the following order:
## 1: 
## 2:
Preferred approach for Attending classes/seminars by degree (n)
Bachelor Master Doctorate Total
Face-to-Face 583 73 12 668
Online 301 126 109 536
Mix Mode 767 145 94 1006
Total 1651 344 215 2210
tabfallopen1d<-table(studata$fallopen1, studata$degree)
kable(addmargins(round(prop.table(tabfallopen1d, 2)*100, 1), FUN = list(Total=sum), 1), "pandoc", 
      caption = "Preferred approach for Attending classes/seminars by degree (%)", align = "c")
Preferred approach for Attending classes/seminars by degree (%)
Bachelor Master Doctorate
Face-to-Face 35.3 21.2 5.6
Online 18.2 36.6 50.7
Mix Mode 46.5 42.2 43.7
Total 100.0 100.0 100.0

Figure 4

studata$fallopen1<-ordered(studata$fallopen1, levels = c("Online", "Mix Mode", "Face-to-Face"))

fig_fallopen1_degree<-studata%>%
  filter(!is.na(fallopen1))%>%
  ggplot()+
  geom_bar(aes(x=degree, fill=fallopen1, y=(..count../sum(..count..))), 
           width = 0.6, 
           position = "fill", 
           colour ="black")+
  scale_x_discrete(na.translate=F)+
  scale_y_continuous(labels = percent)+
  guides(fill=guide_legend(title = NULL))+
  labs(x="Degree Level", 
       y=NULL,
       caption = NULL)+
  scale_fill_brewer("#0c0996", 
                    labels=c("Online", "Mix Mode", "Face-to-Face"), 
                    direction = -1)+
  theme_classic()+
  theme(legend.position = "bottom", 
        legend.background = element_rect(linetype = "blank") ,
        axis.text.x = element_text(size = 9),
        axis.title = element_text(size = 10, face = "bold"),
        legend.text = element_text(size = 8), 
        plot.caption= element_text(size = 7))

fig_fallopen1_degree

5. How many months is graduation date delayed due to the COVID-19 pandemic?

studata<-studata%>%
  mutate(mdelay=as.factor(dmonth))

studata$mdelay<-recode(studata$mdelay, 
                       `1`="1-3 months", 
                       `2`="4-6 months",
                       `3`="More than 6 months",
                       `4`="More than 6 months",
                       `5`="More than 6 months")

studata$mdelay<-ordered(studata$mdelay, levels = c("1-3 months", "4-6 months", "More than 6 months"))

# Total
kable(addmargins(table(studata$mdelay), FUN = list(Total=sum)), "pandoc",
      caption = "Expected months for graduation date (n)", align = "lc")
Expected months for graduation date (n)
Var1 Freq
1-3 months 89
4-6 months 165
More than 6 months 82
Total 336
tab3st<-table(studata$mdelay)
kable(round(addmargins(prop.table(tab3st)*100, 1, FUN = list(Total=sum)), 1), "pandoc",
      caption = "Expected months for graduation date (%)", align = "lc")
Expected months for graduation date (%)
Var1 Freq
1-3 months 26.5
4-6 months 49.1
More than 6 months 24.4
Total 100.0
#By degree
kable(addmargins(table(studata$mdelay, studata$degree), FUN = list(Total=sum)), "pandoc",
      caption = "Expected months for graduation date by degree (n)", align = "c")
## Margins computed over dimensions
## in the following order:
## 1: 
## 2:
Expected months for graduation date by degree (n)
Bachelor Master Doctorate Total
1-3 months 28 27 34 89
4-6 months 84 34 47 165
More than 6 months 49 17 16 82
Total 161 78 97 336
tab3.2st<-table(studata$mdelay, studata$degree)
kable(round(addmargins(prop.table(tab3.2st, 2)*100, 1, FUN = list(Total=sum)), 1), "pandoc",
      caption = "Expected months for graduation date by degree (%)", align = "c")
Expected months for graduation date by degree (%)
Bachelor Master Doctorate
1-3 months 17.4 34.6 35.1
4-6 months 52.2 43.6 48.5
More than 6 months 30.4 21.8 16.5
Total 100.0 100.0 100.0

Figure 5

studata$mdelay<-ordered(studata$mdelay, levels = c("More than 6 months", "4-6 months", "1-3 months"))

fig_months_degree<-studata%>%
  filter(!is.na(mdelay))%>%
  ggplot()+
  geom_bar(aes(x=degree, fill=mdelay, y=(..count../sum(..count..))), 
           width = 0.6, 
           position = "fill", 
           colour ="black")+
  scale_x_discrete(na.translate=F)+
  scale_y_continuous(labels = percent)+
  guides(fill=guide_legend(title = NULL))+
  labs(x="Degree Level", 
       y=NULL,
       caption = NULL)+
  scale_fill_brewer("#0c0996", 
                    labels=c("More than\n6 months", "4-6 months", "1-3 months"), 
                    direction = -1)+
  theme_classic()+
  theme(legend.position = "bottom", 
        legend.background = element_rect(linetype = "blank") ,
        axis.text.x = element_text(size = 9),
        axis.title = element_text(size = 10, face = "bold"),
        legend.text = element_text(size = 9), 
        plot.caption= element_text(size = 7))

fig_months_degree

6. What are the reasons for delayed graduation?

studata$reason1<-ifelse(studata$dreason_1==1, 1, 0)
studata$reason2<-ifelse(studata$dreason_2==1, 1, 0)
studata$reason3<-ifelse(studata$dreason_3==1, 1, 0)
studata$reason4<-ifelse(studata$dreason_4==1, 1, 0)
studata$reason5<-ifelse(studata$dreason_5==1, 1, 0)
studata$reason6<-ifelse(studata$dreason_6==1, 1, 0)
studata$reason7<-ifelse(studata$dreason_7==1, 1, 0)

studata$reason1<-recode(studata$reason1, `1`="Yes", `0`="No")
studata$reason2<-recode(studata$reason2, `1`="Yes", `0`="No")
studata$reason3<-recode(studata$reason3, `1`="Yes", `0`="No")
studata$reason4<-recode(studata$reason4, `1`="Yes", `0`="No")
studata$reason5<-recode(studata$reason5, `1`="Yes", `0`="No")
studata$reason6<-recode(studata$reason6, `1`="Yes", `0`="No")
studata$reason7<-recode(studata$reason7, `1`="Yes", `0`="No")

studata$reason1<-as.factor(studata$reason1)
studata$reason2<-as.factor(studata$reason2)
studata$reason3<-as.factor(studata$reason3)
studata$reason4<-as.factor(studata$reason4)
studata$reason5<-as.factor(studata$reason5)
studata$reason6<-as.factor(studata$reason6)
studata$reason7<-as.factor(studata$reason7)

studata$reason1<-ordered(studata$reason1, levels = c("Yes", `0`="No"))
studata$reason2<-ordered(studata$reason2, levels = c("Yes", `0`="No"))
studata$reason3<-ordered(studata$reason3, levels = c("Yes", `0`="No"))
studata$reason4<-ordered(studata$reason4, levels = c("Yes", `0`="No"))
studata$reason5<-ordered(studata$reason5, levels = c("Yes", `0`="No"))
studata$reason6<-ordered(studata$reason6, levels = c("Yes", `0`="No"))
studata$reason7<-ordered(studata$reason7, levels = c("Yes", `0`="No"))

# Total
kable(addmargins(table(studata$reason1), FUN = list(Total=sum)), "pandoc",
      caption = "My coursework or degree required projects have been delayed (n)", align = "lc")
My coursework or degree required projects have been delayed (n)
Var1 Freq
Yes 133
No 208
Total 341
tabr1<-table(studata$reason1)
kable(round(addmargins(prop.table(tabr1)*100, 1, FUN = list(Total=sum)), 1), "pandoc",
      caption = "My coursework or degree required projects have been delayed (%)", align = "lc")
My coursework or degree required projects have been delayed (%)
Var1 Freq
Yes 39
No 61
Total 100
kable(addmargins(table(studata$reason2), FUN = list(Total=sum)), "pandoc",
      caption = "My access to academic facilities/resources has been restricted (n)", align = "lc")
My access to academic facilities/resources has been restricted (n)
Var1 Freq
Yes 208
No 133
Total 341
tabr2<-table(studata$reason2)
kable(round(addmargins(prop.table(tabr2)*100, 1, FUN = list(Total=sum)), 1), "pandoc",
      caption = "My access to academic facilities/resources has been restricted (%)", align = "lc")
My access to academic facilities/resources has been restricted (%)
Var1 Freq
Yes 61
No 39
Total 100
kable(addmargins(table(studata$reason3), FUN = list(Total=sum)), "pandoc",
      caption = "My academic activities requiring travel have been canceled/postponed (n)", align = "lc")
My academic activities requiring travel have been canceled/postponed (n)
Var1 Freq
Yes 46
No 295
Total 341
tabr3<-table(studata$reason3)
kable(round(addmargins(prop.table(tabr3)*100, 1, FUN = list(Total=sum)), 1), "pandoc",
      caption = "My academic activities requiring travel have been canceled/postponed (%)", align = "lc")
My academic activities requiring travel have been canceled/postponed (%)
Var1 Freq
Yes 13.5
No 86.5
Total 100.0
kable(addmargins(table(studata$reason4), FUN = list(Total=sum)), "pandoc",
      caption = "My financial support has become uncertain (n)", align = "lc")
My financial support has become uncertain (n)
Var1 Freq
Yes 108
No 233
Total 341
tabr4<-table(studata$reason4)
kable(round(addmargins(prop.table(tabr4)*100, 1, FUN = list(Total=sum)), 1), "pandoc",
      caption = "My financial support has become uncertain (%)", align = "lc")
My financial support has become uncertain (%)
Var1 Freq
Yes 31.7
No 68.3
Total 100.0
kable(addmargins(table(studata$reason5), FUN = list(Total=sum)), "pandoc",
      caption = "My physical/mental health has worsened (n)", align = "lc")
My physical/mental health has worsened (n)
Var1 Freq
Yes 152
No 189
Total 341
tabr5<-table(studata$reason5)
kable(round(addmargins(prop.table(tabr5)*100, 1, FUN = list(Total=sum)), 1), "pandoc",
      caption = "My physical/mental health has worsened (%)", align = "lc")
My physical/mental health has worsened (%)
Var1 Freq
Yes 44.6
No 55.4
Total 100.0
kable(addmargins(table(studata$reason6), FUN = list(Total=sum)), "pandoc",
      caption = "My family responsibility has become a serious challenge (n)", align = "lc")
My family responsibility has become a serious challenge (n)
Var1 Freq
Yes 96
No 245
Total 341
tabr6<-table(studata$reason6)
kable(round(addmargins(prop.table(tabr6)*100, 1, FUN = list(Total=sum)), 1), "pandoc",
      caption = "My family responsibility has become a serious challenge (%)", align = "lc")
My family responsibility has become a serious challenge (%)
Var1 Freq
Yes 28.2
No 71.8
Total 100.0
kable(addmargins(table(studata$reason7), FUN = list(Total=sum)), "pandoc",
      caption = "Other reason (n)", align = "lc")
Other reason (n)
Var1 Freq
Yes 35
No 306
Total 341
tabr7<-table(studata$reason7)
kable(round(addmargins(prop.table(tabr7)*100, 1, FUN = list(Total=sum)), 1), "pandoc",
      caption = "Other reason (%)", align = "lc")
Other reason (%)
Var1 Freq
Yes 10.3
No 89.7
Total 100.0