reshaping data using tidry

library(tidyr)

# Data
student_data1 <- 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_long1 <- gather(student_data1, exam, score, -student_id, -name)

# Print first few rows:
head(student_data_long1)
##   student_id     name     exam score
## 1          1 Student1 midterm1    76
## 2          2 Student2 midterm1    94
## 3          3 Student3 midterm1    95
## 4          4 Student4 midterm1    83
## 5          5 Student5 midterm1    65
## 6          6 Student6 midterm1    90
library(tidyr)

# Data
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
seperated<-separate(student_data2, name_age, c('name', 'age'), sep = '_')

head(seperated)
##   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
# Split variables exam_scores to separate columns for each exam type
seperated_exams<-separate(student_data2, exam_scores, c("midterm1", "midterm2", "final"), sep = ",")
head(seperated_exams)
##   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
# Transform student_data2 to long format: data is already in long format
library(tidyr)

set.seed(1)

# Data
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")
)

# Complete missing combinations for students
pom<- separate(student_data, name_age, c('name','age'), '_')
pom2<- separate_rows(pom, exam_scores, sep = ',')
pom3<- separate(pom2, exam_scores, c('exam', 'score'), '_')

complete(pom3, student_id, name, age, exam, score)
## # A tibble: 27,000 × 5
##    student_id name  age   exam     score
##         <int> <chr> <chr> <chr>    <chr>
##  1          1 Alice 20    final    75   
##  2          1 Alice 20    final    78   
##  3          1 Alice 20    final    80   
##  4          1 Alice 20    final    82   
##  5          1 Alice 20    final    85   
##  6          1 Alice 20    final    86   
##  7          1 Alice 20    final    88   
##  8          1 Alice 20    final    90   
##  9          1 Alice 20    final    92   
## 10          1 Alice 20    midterm1 75   
## # ℹ 26,990 more rows
library(tidyr)

# Data
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_wide<-separate(student_data, exam_scores, into = c("midterm1", "midterm2", "final"), sep = ",")
student_data_wide<-separate(student_data_wide, name_age, into = c('name', 'age'), sep = '_')

student_data_wide <- spread(student_data_wide, key = midterm1, value = midterm1)
head(student_data_wide)
##   student_id    name age    midterm2    final midterm1_75 midterm1_80
## 1          1    John  21 midterm2_85 final_75        <NA> midterm1_80
## 2          2   Alice  20 midterm2_78 final_80 midterm1_75        <NA>
## 3          3     Bob  22 midterm2_80 final_85        <NA>        <NA>
## 4          4   Emily  23 midterm2_90 final_92        <NA>        <NA>
## 5          5 Michael  22 midterm2_86 final_88        <NA>        <NA>
## 6          6    John  21 midterm2_85 final_75        <NA> midterm1_80
##   midterm1_82 midterm1_85 midterm1_88
## 1        <NA>        <NA>        <NA>
## 2        <NA>        <NA>        <NA>
## 3 midterm1_82        <NA>        <NA>
## 4        <NA>        <NA> midterm1_88
## 5        <NA> midterm1_85        <NA>
## 6        <NA>        <NA>        <NA>
library(tidyr)

# Data
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")
)

# Merge variables name and age to one column called name_age
merge<-unite(seperated, col = "name_age", c("name", "age"), sep = "_" )

head(merge)
##   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