2012-05-24 3 views
0

나는 가구 목록과 그들이 새로운 우편 번호로 옮긴 날짜가 있습니다. 작은 부분은 다음과 같습니다 :열을 통한 R 관측

ADD0 <- as.Date(c("2008-07-01", "1998-07-01", "2001-11-01", "1997-08-01"), format="%Y-%m-%d") 
ADD1 <- as.Date(c(NA, "2001-09-01", "2002-03-01", NA), format="%Y-%m-%d") 
ADD2 <- as.Date(c(NA, "1992-09-01", "2001-09-01", "2007-12-01"), format="%Y-%m-%d") 
ZIP0 <- as.character(c(30126, 30345, 30068, 30253)) 
ZIP1 <- as.character(c(NA, 30263, 31064, NA)) 
ZIP2 <- as.character(c(NA, 30345, 30067,30062)) 
DF <- data.frame(ADD0, ZIP0, ADD1, ZIP1, ADD2, ZIP2) 
> DF 
     ADD0 ZIP0  ADD1 ZIP1  ADD2 ZIP2 
1 2008-07-01 30126  <NA> <NA>  <NA> <NA> 
2 1998-07-01 30345 2001-09-01 30263 1992-09-01 30345 
3 2001-11-01 30068 2002-03-01 31064 2001-09-01 30067 
4 1997-08-01 30253  <NA> <NA> 2007-12-01 30062 

그래서 집 2는 1998 년 7 월, 2001 년 9 월 및 92 년 9 월에 이동했습니다. 보시다시피 내 문제는 날짜가 반드시 올바른 순서가 아니며 내가 있어야한다는 것입니다. 이 작업을 수행하는 유일한 방법은 데이터 집합을 반복하고 내 자신의 정렬 알고리즘을 작성하는 것입니다. 450k 관측이 있기 때문에 효율도 중요합니다.

이전에 이런 종류의 작업을 한 사람이 있습니까? 어떤 팁? 내가 찾지 못한 깨끗한 해결책이 있습니까?

+0

** 데이터를 올바른 순서로 한 번 정렬 ** 처리하는 ** 문제는 무엇입니까? 어쨌든 한 번 이상 반복해야합니다. 정렬은 가능한 한 저렴합니다. 당신은 자신의 정렬 알고리즘을 발명 할 필요가 없습니다! –

+0

나는 네가 무슨 뜻인지 정확히 모르겠다. 데이터를 사전 처리하는 방법을 묻습니다. 나는 그것을 단순 정렬 ​​작업으로 보지 않는다. 왜냐하면 그것은 일반적으로 벡터 정렬과 관련되기 때문이다. 나는 내가 받아 들였던 대답이 정확하게 내가 얻고 싶어하는 해결책을 제공한다고 믿는다. 대안이 있습니까? – gregmacfarlane

답변

1

기본 reshape 패키지를 사용하면 열을 추가하여 house 데이터를 길게 바꿉니다. 그런 다음 주문하십시오.

DF$house <- row.names(DF) 
df.long <- reshape(DF, 
        idvar='house', 
        varying=list(c('ADD0', 'ADD1', 'ADD2'), 
           c('ZIP0', 'ZIP1', 'ZIP2')), 
        v.names=c('add', 'zip'), 
        timevar=NULL, 
        direction='long') 
df.long <- df.long[order(df.long$house, df.long$add),] 


    house  add zip 
1.1  1 2008-07-01 30126 
1.2  1  <NA> <NA> 
1.3  1  <NA> <NA> 
2.3  2 1992-09-01 30345 
2.1  2 1998-07-01 30345 
2.2  2 2001-09-01 30263 
3.3  3 2001-09-01 30067 
3.1  3 2001-11-01 30068 
3.2  3 2002-03-01 31064 
4.1  4 1997-08-01 30253 
4.3  4 2007-12-01 30062 
4.2  4  <NA> <NA> 
> 
+1

나는이 해결책을 정말로 좋아한다. 분석의 다른 부분에 필요한 'wide'형식으로 복원하려면'$ add' 벡터에'desc()'를 사용하고'df.long $ add.num <- sequence 테이블 (df.long $ house))'그리고 나서'df.wide <- reshape (df.long, idvar = "house", timevar = "add.num")로 재구성했다. – gregmacfarlane

+0

이전에 사용했던'reshape' 명령의 단순성을 제외하고,'varying' 옵션에'list'를 사용하고있었습니다. 나는 결코 이것에 독립적으로 도착하지 않았을 것이다. – gregmacfarlane

+0

두 단계로 용융 공정을 수행 할 수도 있습니다. 'melt '(DF, id.var ='house ', measure.var = c ('ADD0 ','ADD1 ','ADD2 '), value.name ='add ')'그리고 집에'merge ' . 그러나 그것은 매우 clunkier하게 보인다. – Justin

0

아마도 매우 느리지 만 형식을 유지하는 루프 기반 솔루션입니다.

DF <- data.frame(ADD0, ZIP0, ADD1, ZIP1, ADD2, ZIP2, stringsAsFactors = F) 
DF2 = DF 

for (i in 1:nrow(DF)){ 
    DF2[i,] = DF[i, 
    rep(order(DF[i,1:(ncol(DF)/2) * 2 -1])*2, each = 2) + (-1:0)] 
} 

나는 다른 답변에도 동의합니다. 난 여기서 어려움의 핵심 원인은 데이터가 여기에 저장되는 방식으로 생각합니다. 작업하기에별로 도움이되지 않습니다.

+0

이 단계에서 사용하는 것은 도움이되지 않습니다. 프로세스의 다른 단계에서는 데이터가 단일 행에 있어야합니다. – gregmacfarlane