R列跨列的观察

时间:2012-05-24 13:47:14

标签: r sorting data-mining

我有一份住户清单,以及他们搬入新邮政编码的日期。一小部分如下:

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月,'9月'和9月'移动。正如你所看到的,我的问题是日期不一定是正确的顺序,我需要它们。我能看到这样做的唯一方法是遍历数据集并编写我自己的排序算法,这是我很少有的经验。效率也很重要,因为我有450k观测值。

以前有人做过这种事吗?有小费吗?是否有一个我无法找到的清洁解决方案?

2 个答案:

答案 0 :(得分: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 :(得分: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)] 
}

我同意另一位回答者的意见。我认为这里存在困难的核心原因是数据存储在这里的方式,这对于使用起来非常有帮助。