在tidyverse中跨组使用配对数据

在tidyverse中跨组使用配对数据,r,grouping,tidyverse,reshape2,R,Grouping,Tidyverse,Reshape2,我对几个小组中的每个小组都进行了多次观察,我想制作一个QQ图矩阵(或其他类型的图),将每个小组与其他小组进行比较 下面是我所说的一个例子: library(tidyverse) set.seed(27599) n <- 30 d <- data_frame(person = c(rep('Alice', n), rep('Bob', n), rep('Charlie', n),

我对几个小组中的每个小组都进行了多次观察,我想制作一个QQ图矩阵(或其他类型的图),将每个小组与其他小组进行比较

下面是我所说的一个例子:

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);})  
这似乎很有希望

d %>% 
  group_by(person) %>% 
  mutate(score = sort(score)) %>% 
  spread(key = person, value = score)
这会产生“重复标识符”错误。 也许在这里使用更合适

d %>% 
  group_by(person) %>% 
  mutate(score = sort(score)) %>% 
  dcast(formula = score ~ person)

这将创建一个包含120行的data.frame,大多数值(每人90行)都是NA。如何创建一个宽的data.frame而不引入这么多NA?

您需要一个变量来链接每个人的行位置。试一试

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);})
by_tidyverse%
分组单位(人)%>%
突变(rowID=1:n(),
分数=排序(分数)
) %>% 
价差(关键=人,价值=分数)%>%
选择(-rowID)
成对(x=by_tidyverse,lower.panel=function(x,y){点(x,y);abline(0,1);})
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);})