Edit: I’m updating this answer since pivot_wider has been around for a while now and addresses the issue in this question and comments. You can now do
pivot_wider(
dat,
id_cols="Person",
names_from = 'Time',
values_from = c('Score1', 'Score2', 'Score3'),
names_glue="{Time}.{.value}"
)
to get the desired result.
The original answer was
dat %>%
gather(temp, score, starts_with("Score")) %>%
unite(temp1, Time, temp, sep = ".") %>%
spread(temp1, score)