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 回答