R Markdown

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

Using Spread

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

Using data.table / melt

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