Reshaping
#GATHER
set.seed(2137)
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, "exam", "score", -student_id, -name)
# Print first few rows:
head(student_data_long)
## student_id name exam score
## 1 1 Student1 midterm1 85
## 2 2 Student2 midterm1 76
## 3 3 Student3 midterm1 73
## 4 4 Student4 midterm1 76
## 5 5 Student5 midterm1 73
## 6 6 Student6 midterm1 95
#SEPARATE
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, 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("exam_1", "exam_2","exam_3"), sep=",")
student_data2 <- separate(student_data2, exam_1,
into = c("exam_1", "midterm1"), sep="_")
student_data2 <- separate(student_data2, exam_2,
into = c("exam_2", "midterm2"), sep="_")
student_data2 <- separate(student_data2, exam_3,
into = c("exam_3", "final"), sep="_")
# Transform student_data2 to long format
student_data2 <- subset(student_data2, select = -c(exam_1, exam_2, exam_3))
student_data_long2 <- gather(student_data2, exam_type, score, -student_id, -name, -age)
head(student_data_long2)
## student_id name age exam_type score
## 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
#COMPLETE
library(tidyr)
library(dplyr)
##
## Dołączanie pakietu: 'dplyr'
## Następujące obiekty zostały zakryte z 'package:stats':
##
## filter, lag
## Następujące obiekty zostały zakryte z 'package:base':
##
## intersect, setdiff, setequal, union
# Data
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")
)
student_data3 <- separate(student_data3, name_age, into = c("name", "age"), sep = "_")
student_data3 <- separate(student_data3, exam_scores, into = c("midterm1_name", "midterm1_score", "midterm2_name", "midterm2_score", "final_name", "final_score"), sep = "[_,]")
colnames(student_data3) <- c("student_id", "name", "age", "exam_name", "exam_score", "exam_name2", "exam_score2", "exam_name3", "exam_score3")
# Complete missing combinations for students
student_data3 <- complete(student_data3, student_id, nesting(name, age), fill = list(exam_name = NA, exam_score = NA, exam_name2 = NA, exam_score2 = NA, exam_name3 = NA, exam_score3 = NA))
head(student_data3)
## # A tibble: 6 × 9
## student_id name age exam_name exam_score exam_name2 exam_score2 exam_name3
## <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 1 Alice 20 <NA> <NA> <NA> <NA> <NA>
## 2 1 Bob 22 <NA> <NA> <NA> <NA> <NA>
## 3 1 Emily 23 <NA> <NA> <NA> <NA> <NA>
## 4 1 John 21 midterm1 80 midterm2 85 final
## 5 1 Micha… 22 <NA> <NA> <NA> <NA> <NA>
## 6 2 Alice 20 midterm1 75 midterm2 78 final
## # ℹ 1 more variable: exam_score3 <chr>
#SPREAD
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 <- student_data %>%
separate(name_age, into = c("name", "age"), sep = "_") %>%
separate_rows(exam_scores, sep = ",") %>%
separate(exam_scores, into = c("exam", "score"), sep = "_") %>%
pivot_wider(names_from = exam, values_from = score)
head(student_data_wide)
## # A tibble: 6 × 6
## student_id name age midterm1 midterm2 final
## <int> <chr> <chr> <chr> <chr> <chr>
## 1 1 John 21 80 85 75
## 2 2 Alice 20 75 78 80
## 3 3 Bob 22 82 80 85
## 4 4 Emily 23 88 90 92
## 5 5 Michael 22 85 86 88
## 6 6 John 21 80 85 75
#UNITE \/
student_data_long <- student_data_wide %>%
unite(name_age, name, age, sep=",")
head(student_data_long)
## # A tibble: 6 × 5
## student_id name_age midterm1 midterm2 final
## <int> <chr> <chr> <chr> <chr>
## 1 1 John,21 80 85 75
## 2 2 Alice,20 75 78 80
## 3 3 Bob,22 82 80 85
## 4 4 Emily,23 88 90 92
## 5 5 Michael,22 85 86 88
## 6 6 John,21 80 85 75