2012-11-01 2 views
1

길쭉한 모양에서 넓은 모양으로 바꿔야합니다. 시간 변수가 없습니다. 이후 r (재구성 패키지 아님)에서 다시 변형하기 위해 다음 데이터 세트의 각 id에 대해 시간 변수를 만드는 가장 쉬운 방법은 무엇입니까?reshape 데이터 세트 r

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=T),val=rnorm(n=300),date=sample(h,300,replace=T)) 

// M

답변

4

여기서 하나의 가능한 방법이다. 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" 
+0

'ave'를 호출하기 전에 data.frame을 정렬 할 필요는 없습니다. –

+0

@BrianDiggs, 꼭 필요한 것은 아닙니다 *, 나는 동의합니다. 그러나 나는'data.frame'에서'date.1'을'date.2'보다 더 빠른 날짜로 사용하고'order() '를 사용하면이 경우를 보장합니다. – A5C1D2H2I1M1N2O1R2T1

+0

나는 mrdwab에 동의한다. 비록 질문에 명시 적으로 언급하지는 않았지만 ... – Misha

관련 문제