1) xtabs Используя только базу R, создайте столбец порядкового номера в классе, а затем используйте xtabs
, чтобы преобразовать его в таблицу.Наконец преобразовать это в фрейм данных.Пропустите последнюю строку кода, если таблицы достаточно.
data.tab2 <- transform(data.tab, seq = ave(V2, V2, FUN = seq_along))
xt <- xtabs(V1 ~ V2 + seq, data.tab2)
as.data.frame.matrix(xt)
, давая:
1 2 3 4 5 6 7 8
1 644 76 78 350 45 0 0 0
2 37 366 46 0 0 0 0 0
3 71 28 97 30 55 65 116 30
4 18 143 99 0 0 0 0 0
2) ts Другое базовое решение R состоит в преобразовании элементовкаждого класса в ряд ts
, дающий tt
многомерный временной ряд с NA на концах более коротких.Преобразуйте эти NA в 0 во второй строке кода, а затем преобразуйте их во фрейм данных в последней строке.
tt <- do.call("cbind", lapply(unstack(data.tab), ts))
tt[] <- ifelse(is.na(tt), 0, tt)
as.data.frame(t(tt))
3) Используя data.tab2 из (1), используйтеtapply
, чтобы создать матрицу mat
и затем преобразовать ее в data.frame.Пропустите последнюю строку кода, если матрицы достаточно.
mat <- with(data.tab2, tapply(V1, list(V2, seq), c, default = 0))
as.data.frame(mat)
Примечание
Комментарий утверждал, что ifelse
будет медленнее, чем предлагаемая альтернатива, но сравнительный анализ не показал общей разницы вданные в вопросе.Конечно, производительность может быть не очень важной здесь, в первую очередь.
library(rbenchmark)
benchmark(
ifelse = {
tt <- do.call("cbind", lapply(unstack(data.tab), ts))
tt[] <- ifelse(is.na(tt), 0, tt)
as.data.frame(t(tt))
},
replace = {
tt <- do.call("cbind", lapply(unstack(data.tab), ts))
tt[is.na(tt)] <- 0
as.data.frame(t(tt))
}
)[1:4]
давая:
test replications elapsed relative
1 ifelse 100 0.25 1
2 replace 100 0.25 1