Although I find it more common to convert wide to long, it is also helpful to know how to convert from long to wide. Two of the most popular ways to do this using the “spread” function from tidyr or “dcast” from data.table.
First, we’ll create some data and load our library
library(tidyr)
## Create some data ##
patient <- c('Randy', 'Anne', 'Sawyer', 'Taylor')
group <- c('testA', 'testA', 'testB', 'testB')
measure <- c('measure1', 'measure1', 'measure1', 'measure1',
'measure2', 'measure2', 'measure2', 'measure2',
'measure3', 'measure3', 'measure3', 'measure3',
'measure4', 'measure4', 'measure4', 'measure4'
)
value <- c(22,24,20,20,24,22,19,18,25,21,16,15,20,19,14,12)
patient_data <- data.frame(patient, group, measure, value)
patient_data
## patient group measure value
## 1 Randy testA measure1 22
## 2 Anne testA measure1 24
## 3 Sawyer testB measure1 20
## 4 Taylor testB measure1 20
## 5 Randy testA measure2 24
## 6 Anne testA measure2 22
## 7 Sawyer testB measure2 19
## 8 Taylor testB measure2 18
## 9 Randy testA measure3 25
## 10 Anne testA measure3 21
## 11 Sawyer testB measure3 16
## 12 Taylor testB measure3 15
## 13 Randy testA measure4 20
## 14 Anne testA measure4 19
## 15 Sawyer testB measure4 14
## 16 Taylor testB measure4 12
Use Spread to convert the data long to wide.
patient_data %>% spread(key=measure, value=value, )
## patient group measure1 measure2 measure3 measure4
## 1 Anne testA 24 22 21 19
## 2 Randy testA 22 24 25 20
## 3 Sawyer testB 20 19 16 14
## 4 Taylor testB 20 18 15 12
I am a big fan of using data.table. There is also a data.table way to convert long to wide
library(data.table)
## Warning: package 'data.table' was built under R version 3.5.3
## Convert to data table
patient_data <- data.table(patient_data)
# Melt
patient_data %>% dcast(group+patient ~ measure, value.var="value")
## group patient measure1 measure2 measure3 measure4
## 1: testA Anne 24 22 21 19
## 2: testA Randy 22 24 25 20
## 3: testB Sawyer 20 19 16 14
## 4: testB Taylor 20 18 15 12