使用tidyverse中的组之间的配对数据

时间:2017-04-01 20:36:28

标签: 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),
                           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);})  

在这里,我手动操纵数据并使用graphics :: pairs()来绘制图表。可以在tidyverse中完成同样的工作吗?

这是我尝试过的。

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

这看起来很有希望。

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

这会给出重复的标识符&#39;错误。 也许reshape2会更好用在这里?

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

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

1 个答案:

答案 0 :(得分:0)

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

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);})