【发布时间】:2015-06-28 19:20:59
【问题描述】:
我正在尝试获取长格式的列并将它们扩展为宽格式,如下所示。我想使用 tidyr 通过我正在投资的数据处理工具来解决这个问题,但为了使这个答案更通用,请提供其他解决方案。
这是我所拥有的:
library(dplyr); library(tidyr)
set.seed(10)
dat <- data_frame(
Person = rep(c("greg", "sally", "sue"), each=2),
Time = rep(c("Pre", "Post"), 3),
Score1 = round(rnorm(6, mean = 80, sd=4), 0),
Score2 = round(jitter(Score1, 15), 0),
Score3 = 5 + (Score1 + Score2)/2
)
## Person Time Score1 Score2 Score3
## 1 greg Pre 80 78 84.0
## 2 greg Post 79 80 84.5
## 3 sally Pre 75 74 79.5
## 4 sally Post 78 78 83.0
## 5 sue Pre 81 78 84.5
## 6 sue Post 82 81 86.5
所需的宽格式:
Person Pre.Score1 Pre.Score2 Pre.Score3 Post.Score1 Post.Score2 Post.Score3
1 greg 80 78 84.0 79 80 84.5
2 sally 75 74 79.5 78 78 83.0
3 sue 81 78 84.5 82 81 86.5
我可以通过为每个分数做这样的事情来做到这一点:
spread(dat %>% select(Person, Time, Score1), Time, Score1) %>%
rename(Score1_Pre = Pre, Score1_Post = Post)
然后使用_join,但这似乎很冗长,并且必须有更好的方法。
相关问题:
tidyr wide to long with two repeated measures
Is it possible to use spread on multiple columns in tidyr similar to dcast?
【问题讨论】:
-
使用
data.table的开发版本更容易,即。dcast(setDT(dat), Person~Time, value.var=c('Score1', 'Score2', 'Score3')) -
@TylerRinker,我认为他指的是您结果的第二列