2017-04-01 4 views
0

J'ai plusieurs observations de chacun de quelques groupes et j'aimerais faire une matrice de graphiques QQ (ou un autre type de graphique), en comparant chaque groupe à tous les autres groupes.Travailler avec des données appariées à travers des groupes dans le tidyverse

Voici un exemple de ce que je parle:

library(tidyverse) 
set.seed(27599) 
n <- 30 
d <- data_frame(person = c(rep('Alice', n), 
          rep('Bob', n), 
          rep('Charlie', n), 
          rep('Danielle', n)), 
       score = c(rnorm(n = n), 
          rnorm(n = n, mean = 0.1), 
          rnorm(n = n, sd = 2), 
          rnorm(n = n, mean = 0.3, sd = 1.4))) 

by_hand <- data_frame(a = sort(d$score[d$person == 'Alice']), 
         b = sort(d$score[d$person == 'Bob']), 
         c = sort(d$score[d$person == 'Charlie']), 
         d = sort(d$score[d$person == 'Danielle'])) 

pairs(x = by_hand, 
     lower.panel = function(x, y) { points(x, y); abline(0, 1);}) 

Ici, j'ai manipulé les données à la main et graphiques :: paires utilisé() pour l'intrigue. Peut-on faire la même chose à l'intérieur du tidyverse?

Voici ce que j'ai essayé.

d %>% 
    group_by(person) %>% 
    mutate(score = sort(score)) %>% 
    glimpse() 

Ceci semble prometteur.

d %>% 
    group_by(person) %>% 
    mutate(score = sort(score)) %>% 
    spread(key = person, value = score) 

Ceci donne l'erreur 'identificateurs en double'. Peut-être que reshape2 serait préférable d'utiliser ici? Ceci crée un data.frame avec 120 lignes, et la plupart des valeurs (90 par personne) sont NA. Comment puis-je créer un large data.frame sans introduire autant de NA?

Répondre

0

Vous avez besoin d'une variable qui lie la position de ligne pour chaque personne. Essayez

by_tidyverse <- d %>% 
    group_by(person) %>% 
    mutate(rowID=1:n(), 
     score=sort(score) 
) %>% 
    spread(key = person, value = score) %>% 
    select(-rowID) 

pairs(x = by_tidyverse, lower.panel = function(x, y) { points(x, y); abline(0, 1);})