library(tidyverse)
library(openintro)
library(tibble)

1. Normalization

Here I have three tables which demonstrate UNF, INF, 2NF and 3NF.

# Unnormalized Data (UNF)
unnormalized_data <- tibble(
  EmployeeID = c(1, 2, 3, 4),
  Name = c("Alice", "Bob", "Yvonne", "Emily"),
  Department = c("HR", "Finance", "IT", "Management"),
  Projects = c("Recruitment, Payroll", "Budgeting, Forecasting", "Software, database", "Commissioning, Opening"),
  Skills = c("Communication, Management", "Analysis, Excel", "Development, testing", "Resource, Planning")
)

print(unnormalized_data)
## # A tibble: 4 × 5
##   EmployeeID Name   Department Projects               Skills                   
##        <dbl> <chr>  <chr>      <chr>                  <chr>                    
## 1          1 Alice  HR         Recruitment, Payroll   Communication, Management
## 2          2 Bob    Finance    Budgeting, Forecasting Analysis, Excel          
## 3          3 Yvonne IT         Software, database     Development, testing     
## 4          4 Emily  Management Commissioning, Opening Resource, Planning

1NF

# Data in First Normal form (1NF) 

first_normal_form <- tibble(
  EmployeeID = c(1, 1, 2, 2, 3, 3, 4, 4),
  Name = c("Alice", "Alice", "Bob", "Bob", "Yvonne", "Yvonne", "Emily", "Emily"),
  Department = c("HR", "HR", "Finance", "Finance", "IT", "IT", "Management", "Management"),
  Project = c("Recruitment", "Payroll", "Budgeting", "Forecasting", "Software", "Database", "Commissioning", "Opening"),
  Skill = c("Communication", "Management", "Analysis", "Excel", "Development", "Testing", "Resource", "Planning")
)

print(first_normal_form)
## # A tibble: 8 × 5
##   EmployeeID Name   Department Project       Skill        
##        <dbl> <chr>  <chr>      <chr>         <chr>        
## 1          1 Alice  HR         Recruitment   Communication
## 2          1 Alice  HR         Payroll       Management   
## 3          2 Bob    Finance    Budgeting     Analysis     
## 4          2 Bob    Finance    Forecasting   Excel        
## 5          3 Yvonne IT         Software      Development  
## 6          3 Yvonne IT         Database      Testing      
## 7          4 Emily  Management Commissioning Resource     
## 8          4 Emily  Management Opening       Planning

2NF

# Create Employee-Department table
employee_department <- tibble(
  EmployeeID = c(1, 2, 3, 4),
  Name = c("Alice", "Bob", "Yvonne", "Emily"),
  Department = c("HR", "Finance", "IT", "Management")
)

# Create Employee-Project table
employee_project <- tibble(
  EmployeeID = c(1, 1, 2, 2, 3, 3, 4, 4),
  Project = c("Recruitment", "Payroll", "Budgeting", "Forecasting", "Software", "Database", "Comissioning", "Opening")
)

# Create Employee-Skill table
employee_skill <- tibble(
  EmployeeID = c(1, 1, 2, 2, 3, 3, 4, 4),
  Skill = c("Communication", "Management", "Analysis", "Excel", "Development", "Testing", "Resource", "Planning")
)

print(employee_department)
## # A tibble: 4 × 3
##   EmployeeID Name   Department
##        <dbl> <chr>  <chr>     
## 1          1 Alice  HR        
## 2          2 Bob    Finance   
## 3          3 Yvonne IT        
## 4          4 Emily  Management
print(employee_project)
## # A tibble: 8 × 2
##   EmployeeID Project     
##        <dbl> <chr>       
## 1          1 Recruitment 
## 2          1 Payroll     
## 3          2 Budgeting   
## 4          2 Forecasting 
## 5          3 Software    
## 6          3 Database    
## 7          4 Comissioning
## 8          4 Opening
print(employee_skill)
## # A tibble: 8 × 2
##   EmployeeID Skill        
##        <dbl> <chr>        
## 1          1 Communication
## 2          1 Management   
## 3          2 Analysis     
## 4          2 Excel        
## 5          3 Development  
## 6          3 Testing      
## 7          4 Resource     
## 8          4 Planning

3NF

# Create Employee table
employee <- tibble(
  EmployeeID = c(1, 2, 3, 4),
  Name = c("Alice", "Bob", "Yvonne", "Emily")
)

# Create Department table
department <- tibble(
  EmployeeID = c(1, 2, 3, 4),
  Department = c("HR", "Finance", "IT", "Management")
)

# Create Project table
project <- tibble(
  EmployeeID = c(1, 1, 2, 2, 3, 3, 4, 4),
  Project = c("Recruitment", "Payroll", "Budgeting", "Forecasting", "Software", "Database", "Commissioning", "Opening")
)

# Create Skill table
skill <- tibble(
  EmployeeID = c(1, 1, 2, 2, 3, 3, 4, 4),
  Skill = c("Communication", "Management", "Analysis", "Excel", "Development", "Testing", "Resource", "Planning")
)

print(employee)
## # A tibble: 4 × 2
##   EmployeeID Name  
##        <dbl> <chr> 
## 1          1 Alice 
## 2          2 Bob   
## 3          3 Yvonne
## 4          4 Emily
print(department)
## # A tibble: 4 × 2
##   EmployeeID Department
##        <dbl> <chr>     
## 1          1 HR        
## 2          2 Finance   
## 3          3 IT        
## 4          4 Management
print(project)
## # A tibble: 8 × 2
##   EmployeeID Project      
##        <dbl> <chr>        
## 1          1 Recruitment  
## 2          1 Payroll      
## 3          2 Budgeting    
## 4          2 Forecasting  
## 5          3 Software     
## 6          3 Database     
## 7          4 Commissioning
## 8          4 Opening
print(skill)
## # A tibble: 8 × 2
##   EmployeeID Skill        
##        <dbl> <chr>        
## 1          1 Communication
## 2          1 Management   
## 3          2 Analysis     
## 4          2 Excel        
## 5          3 Development  
## 6          3 Testing      
## 7          4 Resource     
## 8          4 Planning

2. Character Manipulation

Identifying majors that contain either “DATA” or “STATISTICS”

# Install and load necessary packages
library(dplyr)
library(stringr)

# Load the dataset from the url given
url <- "https://raw.githubusercontent.com/fivethirtyeight/data/master/college-majors/majors-list.csv"
majors_data <- read.csv(url)

# Display the first few rows of the dataset to understand its structure 
head(majors_data)
##   FOD1P                                 Major                  Major_Category
## 1  1100                   GENERAL AGRICULTURE Agriculture & Natural Resources
## 2  1101 AGRICULTURE PRODUCTION AND MANAGEMENT Agriculture & Natural Resources
## 3  1102                AGRICULTURAL ECONOMICS Agriculture & Natural Resources
## 4  1103                       ANIMAL SCIENCES Agriculture & Natural Resources
## 5  1104                          FOOD SCIENCE Agriculture & Natural Resources
## 6  1105            PLANT SCIENCE AND AGRONOMY Agriculture & Natural Resources
# Filter majors that contain either "DATA" or "STATISTICS" as requested
filtered_majors <- majors_data %>%
  filter(str_detect(Major, "DATA|STATISTICS"))

# Display the filtered majors based on the above criteria
print(filtered_majors)
##   FOD1P                                         Major          Major_Category
## 1  6212 MANAGEMENT INFORMATION SYSTEMS AND STATISTICS                Business
## 2  2101      COMPUTER PROGRAMMING AND DATA PROCESSING Computers & Mathematics
## 3  3702               STATISTICS AND DECISION SCIENCE Computers & Mathematics

3. Describe, in words, what these expressions will match:

(.)\1\1: This expression matches any character that appears three times in a row

“(.)(.)\2\1”: This expression matches a four-character string where the first two characters are mirrored by the second two characters in reverse order.

(..)\1: This expression matches any four-character string where the first two characters are repeated.

“(.).\1.\1”: This expression matches any five-character string where the first, third, and fifth characters are the same, and the second and fourth characters can be any character.

“(.)(.)(.).*\3\2\1” : This expression matches any string where three consecutive characters are followed somewhere later in the string (not necessarily immediately) by those three characters in reverse order.

4. Construct regular expressions to match words that:

Start and end with the same character: ^(.)\1.*\1$

Contain a repeated pair of letters (e.g. “church” contains “ch” repeated twice.): ().*\1

Contain one letter repeated in at least three places (e.g. “eleven” contains three “e”s.): (.(.).\2.\2.)

LS0tDQp0aXRsZTogIldlZWsgMyBBc3NpZ25tZW50Ig0KYXV0aG9yOiAiTWQgQXNhZHVsIElzbGFtIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQNCi0tLQ0KDQpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmxpYnJhcnkodGliYmxlKQ0KYGBgDQoNCiMjIyAxLiBOb3JtYWxpemF0aW9uDQoNCkhlcmUgSSBoYXZlIHRocmVlIHRhYmxlcyB3aGljaCBkZW1vbnN0cmF0ZSBVTkYsIElORiwgMk5GIGFuZCAzTkYuDQoNCmBgYHtyIGNvZGUtY2h1bmstbGFiZWx9DQojIFVubm9ybWFsaXplZCBEYXRhIChVTkYpDQp1bm5vcm1hbGl6ZWRfZGF0YSA8LSB0aWJibGUoDQogIEVtcGxveWVlSUQgPSBjKDEsIDIsIDMsIDQpLA0KICBOYW1lID0gYygiQWxpY2UiLCAiQm9iIiwgIll2b25uZSIsICJFbWlseSIpLA0KICBEZXBhcnRtZW50ID0gYygiSFIiLCAiRmluYW5jZSIsICJJVCIsICJNYW5hZ2VtZW50IiksDQogIFByb2plY3RzID0gYygiUmVjcnVpdG1lbnQsIFBheXJvbGwiLCAiQnVkZ2V0aW5nLCBGb3JlY2FzdGluZyIsICJTb2Z0d2FyZSwgZGF0YWJhc2UiLCAiQ29tbWlzc2lvbmluZywgT3BlbmluZyIpLA0KICBTa2lsbHMgPSBjKCJDb21tdW5pY2F0aW9uLCBNYW5hZ2VtZW50IiwgIkFuYWx5c2lzLCBFeGNlbCIsICJEZXZlbG9wbWVudCwgdGVzdGluZyIsICJSZXNvdXJjZSwgUGxhbm5pbmciKQ0KKQ0KDQpwcmludCh1bm5vcm1hbGl6ZWRfZGF0YSkNCg0KYGBgDQoNCjFORg0KYGBge3IgY2hudWsgY29kZSBmb3IgMU5GfQ0KIyBEYXRhIGluIEZpcnN0IE5vcm1hbCBmb3JtICgxTkYpIA0KDQpmaXJzdF9ub3JtYWxfZm9ybSA8LSB0aWJibGUoDQogIEVtcGxveWVlSUQgPSBjKDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQpLA0KICBOYW1lID0gYygiQWxpY2UiLCAiQWxpY2UiLCAiQm9iIiwgIkJvYiIsICJZdm9ubmUiLCAiWXZvbm5lIiwgIkVtaWx5IiwgIkVtaWx5IiksDQogIERlcGFydG1lbnQgPSBjKCJIUiIsICJIUiIsICJGaW5hbmNlIiwgIkZpbmFuY2UiLCAiSVQiLCAiSVQiLCAiTWFuYWdlbWVudCIsICJNYW5hZ2VtZW50IiksDQogIFByb2plY3QgPSBjKCJSZWNydWl0bWVudCIsICJQYXlyb2xsIiwgIkJ1ZGdldGluZyIsICJGb3JlY2FzdGluZyIsICJTb2Z0d2FyZSIsICJEYXRhYmFzZSIsICJDb21taXNzaW9uaW5nIiwgIk9wZW5pbmciKSwNCiAgU2tpbGwgPSBjKCJDb21tdW5pY2F0aW9uIiwgIk1hbmFnZW1lbnQiLCAiQW5hbHlzaXMiLCAiRXhjZWwiLCAiRGV2ZWxvcG1lbnQiLCAiVGVzdGluZyIsICJSZXNvdXJjZSIsICJQbGFubmluZyIpDQopDQoNCnByaW50KGZpcnN0X25vcm1hbF9mb3JtKQ0KDQoNCg0KYGBgDQoNCjJORg0KDQpgYGB7UiBjaHVuayBjb2RlIGZvciAyTkZ9DQoNCiMgQ3JlYXRlIEVtcGxveWVlLURlcGFydG1lbnQgdGFibGUNCmVtcGxveWVlX2RlcGFydG1lbnQgPC0gdGliYmxlKA0KICBFbXBsb3llZUlEID0gYygxLCAyLCAzLCA0KSwNCiAgTmFtZSA9IGMoIkFsaWNlIiwgIkJvYiIsICJZdm9ubmUiLCAiRW1pbHkiKSwNCiAgRGVwYXJ0bWVudCA9IGMoIkhSIiwgIkZpbmFuY2UiLCAiSVQiLCAiTWFuYWdlbWVudCIpDQopDQoNCiMgQ3JlYXRlIEVtcGxveWVlLVByb2plY3QgdGFibGUNCmVtcGxveWVlX3Byb2plY3QgPC0gdGliYmxlKA0KICBFbXBsb3llZUlEID0gYygxLCAxLCAyLCAyLCAzLCAzLCA0LCA0KSwNCiAgUHJvamVjdCA9IGMoIlJlY3J1aXRtZW50IiwgIlBheXJvbGwiLCAiQnVkZ2V0aW5nIiwgIkZvcmVjYXN0aW5nIiwgIlNvZnR3YXJlIiwgIkRhdGFiYXNlIiwgIkNvbWlzc2lvbmluZyIsICJPcGVuaW5nIikNCikNCg0KIyBDcmVhdGUgRW1wbG95ZWUtU2tpbGwgdGFibGUNCmVtcGxveWVlX3NraWxsIDwtIHRpYmJsZSgNCiAgRW1wbG95ZWVJRCA9IGMoMSwgMSwgMiwgMiwgMywgMywgNCwgNCksDQogIFNraWxsID0gYygiQ29tbXVuaWNhdGlvbiIsICJNYW5hZ2VtZW50IiwgIkFuYWx5c2lzIiwgIkV4Y2VsIiwgIkRldmVsb3BtZW50IiwgIlRlc3RpbmciLCAiUmVzb3VyY2UiLCAiUGxhbm5pbmciKQ0KKQ0KDQpwcmludChlbXBsb3llZV9kZXBhcnRtZW50KQ0KcHJpbnQoZW1wbG95ZWVfcHJvamVjdCkNCnByaW50KGVtcGxveWVlX3NraWxsKQ0KDQpgYGANCjNORg0KYGBge3IgY2h1bmsgY29kZSBmb3IgM05GfQ0KIyBDcmVhdGUgRW1wbG95ZWUgdGFibGUNCmVtcGxveWVlIDwtIHRpYmJsZSgNCiAgRW1wbG95ZWVJRCA9IGMoMSwgMiwgMywgNCksDQogIE5hbWUgPSBjKCJBbGljZSIsICJCb2IiLCAiWXZvbm5lIiwgIkVtaWx5IikNCikNCg0KIyBDcmVhdGUgRGVwYXJ0bWVudCB0YWJsZQ0KZGVwYXJ0bWVudCA8LSB0aWJibGUoDQogIEVtcGxveWVlSUQgPSBjKDEsIDIsIDMsIDQpLA0KICBEZXBhcnRtZW50ID0gYygiSFIiLCAiRmluYW5jZSIsICJJVCIsICJNYW5hZ2VtZW50IikNCikNCg0KIyBDcmVhdGUgUHJvamVjdCB0YWJsZQ0KcHJvamVjdCA8LSB0aWJibGUoDQogIEVtcGxveWVlSUQgPSBjKDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQpLA0KICBQcm9qZWN0ID0gYygiUmVjcnVpdG1lbnQiLCAiUGF5cm9sbCIsICJCdWRnZXRpbmciLCAiRm9yZWNhc3RpbmciLCAiU29mdHdhcmUiLCAiRGF0YWJhc2UiLCAiQ29tbWlzc2lvbmluZyIsICJPcGVuaW5nIikNCikNCg0KIyBDcmVhdGUgU2tpbGwgdGFibGUNCnNraWxsIDwtIHRpYmJsZSgNCiAgRW1wbG95ZWVJRCA9IGMoMSwgMSwgMiwgMiwgMywgMywgNCwgNCksDQogIFNraWxsID0gYygiQ29tbXVuaWNhdGlvbiIsICJNYW5hZ2VtZW50IiwgIkFuYWx5c2lzIiwgIkV4Y2VsIiwgIkRldmVsb3BtZW50IiwgIlRlc3RpbmciLCAiUmVzb3VyY2UiLCAiUGxhbm5pbmciKQ0KKQ0KDQpwcmludChlbXBsb3llZSkNCnByaW50KGRlcGFydG1lbnQpDQpwcmludChwcm9qZWN0KQ0KcHJpbnQoc2tpbGwpDQoNCg0KYGBgDQoNCiMjIyAyLiBDaGFyYWN0ZXIgTWFuaXB1bGF0aW9uDQoNCklkZW50aWZ5aW5nIG1ham9ycyB0aGF0IGNvbnRhaW4gZWl0aGVyICJEQVRBIiBvciAiU1RBVElTVElDUyINCg0KYGBge3IgY29kZSBjaHVuayBmb3IgaWRlbnRpZnlpbmcgbWFqb3JzfQ0KDQojIEluc3RhbGwgYW5kIGxvYWQgbmVjZXNzYXJ5IHBhY2thZ2VzDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShzdHJpbmdyKQ0KDQojIExvYWQgdGhlIGRhdGFzZXQgZnJvbSB0aGUgdXJsIGdpdmVuDQp1cmwgPC0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9maXZldGhpcnR5ZWlnaHQvZGF0YS9tYXN0ZXIvY29sbGVnZS1tYWpvcnMvbWFqb3JzLWxpc3QuY3N2Ig0KbWFqb3JzX2RhdGEgPC0gcmVhZC5jc3YodXJsKQ0KDQojIERpc3BsYXkgdGhlIGZpcnN0IGZldyByb3dzIG9mIHRoZSBkYXRhc2V0IHRvIHVuZGVyc3RhbmQgaXRzIHN0cnVjdHVyZSANCmhlYWQobWFqb3JzX2RhdGEpDQoNCiMgRmlsdGVyIG1ham9ycyB0aGF0IGNvbnRhaW4gZWl0aGVyICJEQVRBIiBvciAiU1RBVElTVElDUyIgYXMgcmVxdWVzdGVkDQpmaWx0ZXJlZF9tYWpvcnMgPC0gbWFqb3JzX2RhdGEgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KE1ham9yLCAiREFUQXxTVEFUSVNUSUNTIikpDQoNCiMgRGlzcGxheSB0aGUgZmlsdGVyZWQgbWFqb3JzIGJhc2VkIG9uIHRoZSBhYm92ZSBjcml0ZXJpYQ0KcHJpbnQoZmlsdGVyZWRfbWFqb3JzKQ0KDQpgYGANCiMjIyAzLiBEZXNjcmliZSwgaW4gd29yZHMsIHdoYXQgdGhlc2UgZXhwcmVzc2lvbnMgd2lsbCBtYXRjaDoNCg0KKC4pXDFcMTogVGhpcyBleHByZXNzaW9uIG1hdGNoZXMgYW55IGNoYXJhY3RlciB0aGF0IGFwcGVhcnMgdGhyZWUgdGltZXMgaW4gYSByb3dcbg0KDQoiKC4pKC4pXFwyXFwxIjogIFRoaXMgZXhwcmVzc2lvbiBtYXRjaGVzIGEgZm91ci1jaGFyYWN0ZXIgc3RyaW5nIHdoZXJlIHRoZSBmaXJzdCB0d28gY2hhcmFjdGVycyBhcmUgbWlycm9yZWQgYnkgdGhlIHNlY29uZCB0d28gY2hhcmFjdGVycyBpbiByZXZlcnNlIG9yZGVyLlxuDQoNCiguLilcMTogVGhpcyBleHByZXNzaW9uIG1hdGNoZXMgYW55IGZvdXItY2hhcmFjdGVyIHN0cmluZyB3aGVyZSB0aGUgZmlyc3QgdHdvIGNoYXJhY3RlcnMgYXJlIHJlcGVhdGVkLlxuDQoNCiIoLikuXFwxLlxcMSI6IFRoaXMgZXhwcmVzc2lvbiBtYXRjaGVzIGFueSBmaXZlLWNoYXJhY3RlciBzdHJpbmcgd2hlcmUgdGhlIGZpcnN0LCB0aGlyZCwgYW5kIGZpZnRoIGNoYXJhY3RlcnMgYXJlIHRoZSBzYW1lLCBhbmQgdGhlIHNlY29uZCBhbmQgZm91cnRoIGNoYXJhY3RlcnMgY2FuIGJlIGFueSBjaGFyYWN0ZXIuXG4NCg0KIiguKSguKSguKS4qXFwzXFwyXFwxIiA6IFRoaXMgZXhwcmVzc2lvbiBtYXRjaGVzIGFueSBzdHJpbmcgd2hlcmUgdGhyZWUgY29uc2VjdXRpdmUgY2hhcmFjdGVycyBhcmUgZm9sbG93ZWQgc29tZXdoZXJlIGxhdGVyIGluIHRoZSBzdHJpbmcgKG5vdCBuZWNlc3NhcmlseSBpbW1lZGlhdGVseSkgYnkgdGhvc2UgdGhyZWUgY2hhcmFjdGVycyBpbiByZXZlcnNlIG9yZGVyLlxuDQoNCiMjIyA0LiBDb25zdHJ1Y3QgcmVndWxhciBleHByZXNzaW9ucyB0byBtYXRjaCB3b3JkcyB0aGF0Og0KDQpTdGFydCBhbmQgZW5kIHdpdGggdGhlIHNhbWUgY2hhcmFjdGVyOiBcbg0KXiguKVwxLipcMSQNCg0KQ29udGFpbiBhIHJlcGVhdGVkIHBhaXIgb2YgbGV0dGVycyAoZS5nLiAiY2h1cmNoIiBjb250YWlucyAiY2giIHJlcGVhdGVkIHR3aWNlLik6XG4NCihcd1x3KS4qXDENCg0KQ29udGFpbiBvbmUgbGV0dGVyIHJlcGVhdGVkIGluIGF0IGxlYXN0IHRocmVlIHBsYWNlcyAoZS5nLiAiZWxldmVuIiBjb250YWlucyB0aHJlZSAiZSJzLik6XG4NCiguKiguKS4qXDIuKlwyLiopDQoNCg==