Task 1:

student_data <- data.frame(
  student_id = 1:50,
  name = paste0("Student", 1:50),
  midterm1 = sample(60:100, 50, replace = TRUE),
  midterm2 = sample(60:100, 50, replace = TRUE),
  final = sample(60:100, 50, replace = TRUE)
)

Transform data to long format using gather:

student_data_long <- gather(student_data, key="exam_type", value="score", -student_id, -name)

Task 2:

student_data2 <- data.frame(
  student_id = 1:50,
  name_age = c("John_21", "Alice_20", "Bob_22", "Emily_23", "Michael_22"),
  exam_scores = c("midterm1_80,midterm2_85,final_75", "midterm1_75,midterm2_78,final_80", "midterm1_82,midterm2_80,final_85", "midterm1_88,midterm2_90,final_92", "midterm1_85,midterm2_86,final_88")
)

Split variables name_age to 2 separate columns: name and age

student_data2 <- separate(student_data2, name_age, into = c("name", "age"), sep = "_")

Split variables exam_scores to separate columns for each exam type

student_data2 <- separate(student_data2, exam_scores, into = c("midterm1", "midterm2", "final"), sep = ",")

Transform student_data2 to long format

student_data2 <- separate(student_data2, midterm1, into = c("midterm1", "points1"), sep = "_")

student_data2 <- separate(student_data2, midterm2, into = c("midterm2", "points2"), sep = "_")

student_data2 <- separate(student_data2, final, into = c("final", "points3"), sep = "_")

head(student_data2)
##   student_id    name age midterm1 points1 midterm2 points2 final points3
## 1          1    John  21 midterm1      80 midterm2      85 final      75
## 2          2   Alice  20 midterm1      75 midterm2      78 final      80
## 3          3     Bob  22 midterm1      82 midterm2      80 final      85
## 4          4   Emily  23 midterm1      88 midterm2      90 final      92
## 5          5 Michael  22 midterm1      85 midterm2      86 final      88
## 6          6    John  21 midterm1      80 midterm2      85 final      75

Task 3:

student_data3 <- data.frame(
  student_id = 1:50,
  name_age = c("John_21", "Alice_20", "Bob_22", "Emily_23", "Michael_22"),
  exam_scores = c("midterm1_80,midterm2_85,final_75", "midterm1_75,midterm2_78,final_80", "midterm1_82,midterm2_80,final_85", "midterm1_88,midterm2_90,final_92", "midterm1_85,midterm2_86,final_88")
)

Complete missing combinations for students

student_data3 <- separate(student_data3, name_age, into = c("name", "age"), sep = "_")

student_data3 <- separate(student_data3, exam_scores, into = c("midterm1", "midterm2", "final"), sep = ",")

Generate missing combinations for students

complete_data <- complete(student_data3, fill = list(), explicit = TRUE)

head(complete_data)
##   student_id    name age    midterm1    midterm2    final
## 1          1    John  21 midterm1_80 midterm2_85 final_75
## 2          2   Alice  20 midterm1_75 midterm2_78 final_80
## 3          3     Bob  22 midterm1_82 midterm2_80 final_85
## 4          4   Emily  23 midterm1_88 midterm2_90 final_92
## 5          5 Michael  22 midterm1_85 midterm2_86 final_88
## 6          6    John  21 midterm1_80 midterm2_85 final_75

Task 4:

student_data <- data.frame(
  student_id = 1:50,
  name_age = c("John_21", "Alice_20", "Bob_22", "Emily_23", "Michael_22"),
  exam_scores = c("midterm1_80,midterm2_85,final_75", "midterm1_75,midterm2_78,final_80", "midterm1_82,midterm2_80,final_85", "midterm1_88,midterm2_90,final_92", "midterm1_85,midterm2_86,final_88")
)

Transform data to wide format

student_data_names <- student_data %>%
  separate(name_age, into = c("name", "age"), sep = "_") %>%
  mutate(age = as.numeric(age))

student_data_long <- student_data_names %>%
  separate_rows(exam_scores, sep = ",") %>%
  separate(exam_scores, into = c("exam", "score"), sep = "_") %>%
  mutate(score = as.numeric(score))

student_data_wide <- student_data_long %>%
  spread(key = exam, value = score)
head(student_data_wide)
## # A tibble: 6 × 6
##   student_id name      age final midterm1 midterm2
##        <int> <chr>   <dbl> <dbl>    <dbl>    <dbl>
## 1          1 John       21    75       80       85
## 2          2 Alice      20    80       75       78
## 3          3 Bob        22    85       82       80
## 4          4 Emily      23    92       88       90
## 5          5 Michael    22    88       85       86
## 6          6 John       21    75       80       85

Task 5:

Merge variables name and age to one column called name_age

student_data_unite <- student_data_names %>%
  unite(name_age, name, age, sep = "_")
head(student_data_unite)
##   student_id   name_age                      exam_scores
## 1          1    John_21 midterm1_80,midterm2_85,final_75
## 2          2   Alice_20 midterm1_75,midterm2_78,final_80
## 3          3     Bob_22 midterm1_82,midterm2_80,final_85
## 4          4   Emily_23 midterm1_88,midterm2_90,final_92
## 5          5 Michael_22 midterm1_85,midterm2_86,final_88
## 6          6    John_21 midterm1_80,midterm2_85,final_75