私は、縦方向のジオコーディングされたアドレスデータと各ジオコードでの時間長を持っています。次に、各ジオイド位置の特性を与える一連の変数(ここではそれらをxと呼んでいます)があります。ここには2つのケースがありますが、私には何千ものケースがあります。各アドレスに時間の長さによって重み付けされ、私は毎年(2004年、2005年、2006年、2007年)のために、それぞれのケースについて単一の値(1、7)で終わる必要があり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
。ケース1は2004年にジオイド53から45に移動し、ケース7はジオイド16から2007年には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スライスで実行可能かもしれないようだが、私は現時点では失速している。キーは毎年分離しています。
これは実際に私が得ようとしている正確な質問です。私は年を重ねてデータを持っていますが、それぞれの年ごとに指標が必要です。それは私のデータから外挿する方法を見つけることができない部分です – swhusky
id、geoid、xはそれぞれの年に分割して同じ値を扱いますか? –