2016-01-28 14 views
0

我想從另一個數據幀中填充一個數據幀,這取決於第一個數據是否適合第二個數據塊的時間間隔。加入兩個數據框,其中一個日期落入另一個日期中。 R

現在,我正在做一個嵌套for循環,但不用說,這種方法是痛苦的緩慢。

下面是一些樣本數據和我的嵌套的for循環:

library(lubridate) 

periods <- structure(list(week = structure(c(16475, 16489, 16531, 16545,16559, 16573, 16587, 16615, 16629, 16643, 16657, 16671, 16685, 
16699, 16727, 16741, 16755, 16769, 16783, 16797, 16811, 16825 
), class = "Date"), poll = c(6.5, 4, 12, 11.5, 13, 9.5, 7, 8, 
4.5, 4.5, 7.5, 4.8, 6.33333333333333, 7.5, 11.125, 13, 12, 12.8571428571429, 
10.5, 13, 11, 4)), .Names = c("week", "poll"), row.names = 82:103, class = "data.frame") 

periods$week <- as.interval(ymd(period$week), ymd(period$week + weeks(2))) 


weeks <- structure(list(week = structure(c(16720, 16622, 16776, 16720, 
     16734, 16741), class = "Date"), poll = c(NA, NA, NA, NA, NA, 
     13)), .Names = c("week", "poll"), row.names = c(NA, 6L), class = "data.frame") 


for (i in seq_along(weeks$week)){ 
      x <- weeks$week[i] 
      for (j in seq_along(periods$int)){ 
      if (is.na(x)==T){next} 
      else if (x %within% periods$int[j]==T){weeks$poll <- periods[j,2]} 
      else {next} 
      } 
     } 

我假設有一個應用的功能,將加快這,但我似乎無法使它工作...謝謝多爲所有的幫助!

+2

看看package data.table及其''foverlaps'函數。 – Roland

+0

你確定這段代碼能正常工作嗎?句點$ int [j]是if else子句中的類數字,%中的%不起作用。 – kostas

+1

它看起來像使用dput輸出使用lubridate包創建的數據不起作用。我將編輯帖子,以使可重複數據更清晰 – StanO

回答

0

我準備了一個解決方案,在我的情況下工作,所以我會在這裏發佈它,以防其他人發現自己處於類似綁定的情況。

library(lubridate) 
library(data.table) 

periods <- structure(list(week = structure(c(16475, 16489, 16531, 16545,16559, 16573, 16587, 16615, 16629, 16643, 16657, 16671, 16685, 
16699, 16727, 16741, 16755, 16769, 16783, 16797, 16811, 16825 
), class = "Date"), poll = c(6.5, 4, 12, 11.5, 13, 9.5, 7, 8, 
4.5, 4.5, 7.5, 4.8, 6.33333333333333, 7.5, 11.125, 13, 12, 12.8571428571429, 
10.5, 13, 11, 4)), .Names = c("week", "poll"), row.names = 82:103, class = "data.frame") 

periods$week2 <- ymd(periods$week + weeks(2)) 

structure(list(week = structure(c(16720, 16622, 16776, 16720, 
16734, 16741), class = "Date"), poll = c(NA, NA, NA, NA, NA, 
NA)), .Names = c("week", "poll"), row.names = c(NA, 6L), class = "data.frame") 

week$week2 <- week$week 

setDT(periods) 
setDT(weeks) 
setkey(periods, week, week2) 
setkey(weeks, week, week2) 

merged = foverlaps(periods, weeks, by.x=c("week", "week2")) 

這不是很漂亮,但它適用於我的情況。

相關問題