我从几个小组中分别得到了多个观察结果,我想制作一个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?
答案 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);})