1) dplyr / tidyr Предполагая, что ввод DF
такой же, как в примечании, в конце создайте столбец Transcriber
со значениями Transcriber1
и Transcriber2
и столбец Seq
с последовательностьючисла и, наконец, используйте spread
для преобразования в широкую форму.
library(dplyr)
library(tidyr)
DF %>%
group_by(Code) %>%
mutate(Transcriber = as.numeric(factor(Transcriber, levels = unique(Transcriber)))) %>%
group_by(Transcriber = paste0("Transcriber", Transcriber), add = TRUE) %>%
mutate(Seq = seq_along(Errors)) %>%
ungroup %>%
spread(Transcriber, Errors) %>%
select(-Seq)
, дающий:
# A tibble: 14 x 3
Code Transcriber1 Transcriber2
<dbl> <int> <int>
1 1011 1 8
2 1011 2 9
3 1011 3 10
4 1011 4 11
5 1011 5 12
6 1011 6 13
7 1011 7 14
8 2011 15 22
9 2011 16 23
10 2011 17 24
11 2011 18 25
12 2011 19 26
13 2011 20 27
14 2011 21 28
2) База R Решение, использующее только базу R, будетбыть:
make_factor <- function(x) factor(x, levels = unique(x))
DF2 <- transform(DF,
Transcriber = paste0("Transcriber", ave(as.numeric(Transcriber), Code, FUN = make_factor)),
Seq = ave(Errors, Code, Transcriber, FUN = seq_along))
r <- reshape(DF2, dir = "wide", idvar = c("Seq", "Code"), timevar = "Transcriber")[-2]
names(r) <- sub("Errors.", "", names(r))
Примечание
Предполагается, что ввод в воспроизводимой форме будет:
DF <- data.frame(Code = rep(c(1011, 2011), each = 14),
Transcriber = rep(c("Anna", "David", "Susan", "Anna"), each = 7),
Errors = 1:28)