lib

set.seed(123)
library(tidyr)

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 <- gather(student_data, exam, score, -student_id, -name)

# Print first few rows:
head(student_data)
##   student_id     name     exam score
## 1          1 Student1 midterm1    90
## 2          2 Student2 midterm1    74
## 3          3 Student3 midterm1    73
## 4          4 Student4 midterm1    62
## 5          5 Student5 midterm1    96
## 6          6 Student6 midterm1    73

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 = ",")
student_data2$midterm1 <- sapply(strsplit(student_data2$midterm1, "_"), function(x) x[2])
student_data2$midterm2 <- sapply(strsplit(student_data2$midterm2, "_"), function(x) x[2])
student_data2$final <- sapply(strsplit(student_data2$final, "_"), function(x) x[2])

# Transform student_data2 to long format
student_data2 <- gather(student_data2, exam, score, -student_id, -name, -age)

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 <- complete(student_data3, student_id, name, age, fill = list(exam_scores = NA), explicit = TRUE)

4

# Transform data to wide format
student_data4 <- spread(student_data2, key = exam, value = score)
# student_data2 is already the same provided data but now in long format, so I used it to change from long to wide

5

# Merge variables name and age to one column called name_age
student_data5 <- unite(student_data2, name_age, name, age, sep="_", remove=TRUE, na.rm=TRUE)
# student_data2 has name and age separated, so used it to change back to merged