我有一份住户清单,以及他们搬入新邮政编码的日期。一小部分如下:
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观测值。
以前有人做过这种事吗?有小费吗?是否有一个我无法找到的清洁解决方案?
答案 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)]
}
我同意另一位回答者的意见。我认为这里存在困难的核心原因是数据存储在这里的方式,这对于使用起来非常有帮助。