0

世帯のリストと、それらが新しい郵便番号に移動した日付があります。小さなセグメントは次のとおりです。

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は'98年7月、'01年9月、および'92年9月に移転しました。ご覧のとおり、私の問題は、日付が必ずしも正しい順序であるとは限らないことです。これを行うために私が見ることができる唯一の方法は、データセットをループして、私がほとんど経験したことのない独自のソートアルゴリズムを作成することです。45万回の観測があるので、効率も重要です。

誰かが以前にこの種のことをしたことがありますか?任意のヒント?私が見つけることができなかったクリーンな解決策はありますか?

4

2 に答える 2

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>
> 
于 2012-05-24T14:27:18.740 に答える
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)] 
}

しかし、私は他の回答者に同意します。ここでの問題の主な原因は、データがここに保存されている方法であると思います。これは、操作するのにかなり役に立ちません。

于 2012-05-24T14:37:25.980 に答える