Data Wrangling

R Markdown

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.

set.seed(2313213)
library(tidyr)

# Data
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",value="points" , 3:5)

# Print first few rows:

head(student_data_long)
##   student_id     name     exam points
## 1          1 Student1 midterm1    100
## 2          2 Student2 midterm1     93
## 3          3 Student3 midterm1     90
## 4          4 Student4 midterm1     94
## 5          5 Student5 midterm1     66
## 6          6 Student6 midterm1     76
# 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 long format
# This data frame is already in long format:)
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
student_data2<-separate(student_data2,2,c("name","age") ,"_")
head(student_data2)
##   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

student_data2<-separate(student_data2,4,c("midterm1","midterm2","final"),",")
head(student_data2)
##   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
student_data2 <- gather(student_data2, key = "exam", value = "points",4:6)
 student_data2 <- separate(student_data2,5,c("exam","points"),"_")
head(student_data2)
##   student_id    name age     exam points
## 1          1    John  21 midterm1     80
## 2          2   Alice  20 midterm1     75
## 3          3     Bob  22 midterm1     82
## 4          4   Emily  23 midterm1     88
## 5          5 Michael  22 midterm1     85
## 6          6    John  21 midterm1     80
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")
)

# Complete missing combinations for students
student_data <- separate(student_data,3,c("midterm1", "midterm2", "final"), ",")
head(student_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
student_data<-complete(student_data, midterm1, midterm2, final)
head(student_data)
## # A tibble: 6 × 5
##   midterm1    midterm2    final    student_id name_age
##   <chr>       <chr>       <chr>         <int> <chr>   
## 1 midterm1_75 midterm2_78 final_75         NA <NA>    
## 2 midterm1_75 midterm2_78 final_80          2 Alice_20
## 3 midterm1_75 midterm2_78 final_80          7 Alice_20
## 4 midterm1_75 midterm2_78 final_80         12 Alice_20
## 5 midterm1_75 midterm2_78 final_80         17 Alice_20
## 6 midterm1_75 midterm2_78 final_80         22 Alice_20
# Transform data to wide format
student_data2<-spread(student_data2,key="exam",value="points")
head(student_data2)
##   student_id    name age final midterm1 midterm2
## 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
# Merge variables name and age to one column called name_age
head(student_data2)
##   student_id    name age final midterm1 midterm2
## 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
student_data2 <- unite(student_data2,"name_age",name,age, sep = "_")
head(student_data2)
##   student_id   name_age final midterm1 midterm2
## 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