여기서 하나의 가능한 방법이다. ave
을 사용하여 "id"가 몇 번이나 발생했는지에 따라 "time"변수를 만듭니다.이 변수는 나에게 당신이 찾고있는 것과 같은 것으로 들립니다.
귀하의 데이터는하지만, 주문 (그리고 그것을 재현 할 수 set.seed
그래서 다른 사람을 사용) :
set.seed(1)
h <- seq(from=as.Date("2005-06-01"),
to=as.Date("2008-06-30"), by=1)
a <- data.frame(id=sample(c(1:100), 300, replace=TRUE),
val=rnorm(n=300),
date=sample(h, 300, replace=TRUE))
rm(h)
a <- a[order(a$id, a$date), ]
rbind(head(a), tail(a))
# id val date
# 27 2 0.78763961 2007-08-25
# 116 2 0.27005490 2008-03-05
# 281 3 -2.03328560 2006-08-08
# 47 3 1.44115771 2007-06-25
# 133 4 1.32425863 2006-06-14
# 228 5 -0.14587563 2006-10-15
# 111 98 0.95101281 2008-04-29
# 293 99 -0.01825971 2006-01-20
# 139 99 0.43370215 2008-02-20
# 121 100 -0.25893258 2005-06-07
# 18 100 -1.42449465 2007-08-19
# 104 100 -0.24766434 2008-05-11
당신은 table
를 사용하여 검사 8 "회"로 끝날 것이다.
max(table(a$id))
# [1] 8
a$time <- ave(a$id, a$id, FUN=seq_along)
rbind(head(a), tail(a))
# id val date time
# 27 2 0.78763961 2007-08-25 1
# 116 2 0.27005490 2008-03-05 2
# 281 3 -2.03328560 2006-08-08 1
# 47 3 1.44115771 2007-06-25 2
# 133 4 1.32425863 2006-06-14 1
# 228 5 -0.14587563 2006-10-15 1
# 111 98 0.95101281 2008-04-29 1
# 293 99 -0.01825971 2006-01-20 1
# 139 99 0.43370215 2008-02-20 2
# 121 100 -0.25893258 2005-06-07 1
# 18 100 -1.42449465 2007-08-19 2
# 104 100 -0.24766434 2008-05-11 3
a.wide <- reshape(a, direction = "wide", idvar="id", timevar="time")
a.wide[1:8, 1:8]
# id val.1 date.1 val.2 date.2 val.3 date.3 val.4
# 27 2 0.7876396 2007-08-25 0.2700549 2008-03-05 NA <NA> NA
# 281 3 -2.0332856 2006-08-08 1.4411577 2007-06-25 NA <NA> NA
# 133 4 1.3242586 2006-06-14 NA <NA> NA <NA> NA
# 228 5 -0.1458756 2006-10-15 0.5929847 2008-03-31 NA <NA> NA
# 299 6 0.2368037 2006-02-06 1.0341077 2006-10-07 NA <NA> NA
# 10 7 1.8692906 2005-07-19 -0.4839749 2006-06-02 1.435070 2007-11-30 1.017754
# 158 8 0.5672209 2006-08-28 -0.4075286 2006-11-11 -2.285236 2007-03-29 NA
# 69 9 0.6422413 2008-06-20 NA <NA> NA <NA> NA
names(a.wide)
# [1] "id" "val.1" "date.1" "val.2" "date.2" "val.3" "date.3" "val.4"
# [9] "date.4" "val.5" "date.5" "val.6" "date.6" "val.7" "date.7" "val.8"
# [17] "date.8"
'ave'를 호출하기 전에 data.frame을 정렬 할 필요는 없습니다. –
@BrianDiggs, 꼭 필요한 것은 아닙니다 *, 나는 동의합니다. 그러나 나는'data.frame'에서'date.1'을'date.2'보다 더 빠른 날짜로 사용하고'order() '를 사용하면이 경우를 보장합니다. – A5C1D2H2I1M1N2O1R2T1
나는 mrdwab에 동의한다. 비록 질문에 명시 적으로 언급하지는 않았지만 ... – Misha