J’essaie de prendre des colonnes au format long et de les répartir au format large, comme indiqué ci-dessous. Je voudrais utiliser tidyr pour résoudre ce problème avec les outils de manipulation de données dans lesquels j’investis, mais pour que cette réponse soit plus générale, veuillez fournir d’autres solutions.
Voici ce que j’ai:
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
Format large souhaité:
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
Je peux le faire en faisant quelque chose comme ça pour chaque partition:
spread(dat %>% select(Person, Time, Score1), Time, Score1) %>% rename(Score1_Pre = Pre, Score1_Post = Post)
Et puis en utilisant _join
mais cela semble verbeux et comme il doit y avoir un meilleur moyen.
Questions connexes:
tidyr large à long avec deux mesures répétées
Est-il possible d’utiliser réparti sur plusieurs colonnes dans tidyr similaire à dcast?
Si vous voulez restr avec tidyr/dplyr
dat %>% gather(temp, score, starts_with("Score")) %>% unite(temp1, Time, temp, sep = ".") %>% spread(temp1, score)
En utilisant reshape2
:
library(reshape2) dcast(melt(dat), Person ~ Time + variable)
Produit:
Using Person, Time as id variables Person Post_Score1 Post_Score2 Post_Score3 Pre_Score1 Pre_Score2 Pre_Score3 1 greg 79 78 83.5 83 81 87.0 2 sally 82 81 86.5 75 74 79.5 3 sue 78 78 83.0 82 79 85.5
Utilisation de dcast
du package data.table
.
library(data.table)#v1.9.5+ dcast(setDT(dat), Person~Time, value.var=paste0("Score", 1:3))
Ou reshape
partir de baseR
reshape(as.data.frame(dat), idvar='Person', timevar='Time',direction='wide')