我有纵向的地理编码地址数据和每个地理编码的时间长度。然后我有一系列变量(我只是在这里调用它们),它们给出了每个大地水准面位置的特征。下面这里只是两个例子,但我有数千个。使用dplyr处理日期
id<-c(1,1,1,7,7,7,7)
geoid<-c(53,45,45,16,18,42)
start<-c("1/1/2004","10/31/2004","1/1/2005","1/1/2005","6/1/2007","7/2/2007")
end<-c("10/30/2004","12/31/2004","12/31/2007","5/31/2007","7/1/2007","12/31/2007")
x<-c(.5,.7,.7,.3,.4,.6)
dat<-data.frame(id,geoid,x,start,end)
dat$start<-as.Date(dat$start,format='%m/%d/%Y')
dat$end<-as.Date(dat$end,format='%m/%d/%Y')
dat
id geoid x start end
1 53 0.5 2004-01-01 2004-10-30
1 45 0.7 2004-10-31 2004-12-31
1 45 0.7 2005-01-01 2007-12-31
7 16 0.3 2005-01-01 2007-05-31
7 18 0.4 2007-06-01 2007-08-01
7 42 0.6 2007-08-02 2007-12-31
我需要每年为单个值来结束(2004年,2005年,2006年,2007年),并为每个个案(1,7)是通过在每个地址的时间长度进行加权。因此,案例1在2004年从大地水准面53移到45,案例7从2007年的大地水准面16移动到18到42。所以我计算每个大地水准面的年份百分比(最终我将乘以x乘以平均值每年得到一个加权平均值)。案例原地踏步整整一年将在每年单独看,计算全年的百分比获得1
#calculate the percentage of year at each address for id 1
(as.Date("10/31/2004",format='%m/%d/%Y')-as.Date("1/1/2004",format='%m/%d/%Y'))/365.25
Time difference of 0.8323066
(as.Date("12/31/2004",format='%m/%d/%Y')-as.Date("10/31/2004",format='%m/%d/%Y'))/365.25
Time difference of 0.1670089
#calculate the percentage of year at each address for id 7
(as.Date("05/31/2007",format='%m/%d/%Y')-as.Date("1/1/2007",format='%m/%d/%Y'))/365.25
Time difference of 0.4106776
(as.Date("07/01/2007",format='%m/%d/%Y')-as.Date("06/01/2007",format='%m/%d/%Y'))/365.25
Time difference of 0.08213552
(as.Date("12/31/2007",format='%m/%d/%Y')-as.Date("07/02/2007",format='%m/%d/%Y'))/365.25
Time difference of 0.4982888
我可以用蛮力做到这一点的重量在该地址度过。然后我会用x值乘以每个权重,并取这一年的平均值 - 这对于数千个案例来说是不合理的。任何有关如何更有效地解决这个问题的想法都会受到重视。似乎它可能适用于dplyr slice,但目前我暂时停止了。关键是每年分离出来。
这实际上是我试图得到的确切问题。我有数据重叠的年份,但每个年份都需要一个衡量标准。这是我无法弄清楚如何从我的数据中推断出来的部分 – swhusky
当您将它们拆分为单独的年份时,您是否关心列id,大地水准面和x具有相同的值? –