Сначала разделить частичные кадры данных по идентификатору во временный список.
ls1 <- lapply(sort(unique(data$id)), function(x) data[data$id == x, ])
Во-вторых, нумеровать значения для каждого идентификатора и суммировать все обратно в исходную структуру фрейма данных.
data <- do.call(rbind,
lapply(1:(length(ls1)),
function(x) transform(ls1[[x]],
time=1:length(ls1[[x]][[1]]))))
rm(ls1) # remove tmp list
Наконец, используйте reshape()
.
result <- reshape(data, idvar="time", timevar="id", direction="wide")
Выход:
> head(result)
time value.1 value.2 value.3 value.4 value.5 value.6 value.7 value.8 value.9 value.10
25 1 8097 8445 7029 3001 2823 7371 8359 6504 8902 9901
35 2 565 6701 6765 1187 116 9527 1680 3701 8514 4441
37 3 5383 5311 1073 9261 7899 6894 2297 1335 2910 5700
43 4 4885 6716 1608 6547 7379 5821 1295 866 702 8029
55 5 7721 8430 5324 6937 195 5758 1704 8017 9744 2062
71 6 4537 7004 8477 2071 9130 2072 4455 6628 6076 3888
> dim(result)
[1] 226 11
Данные:
set.seed(42)
data <- data.frame(id=sample(1:10, 2000, replace=TRUE),
value=sample(100:10000, 2000, replace=TRUE))