【问题标题】:Joining two dataframes where a date in one falls into an interval in another. R连接两个数据帧,其中一个日期落入另一个数据帧的间隔。 R
【发布时间】:2016-01-28 09:04:14
【问题描述】:

我正在尝试根据第一个日期的日期是否适合第二个的间隔来用另一个数据框的值填充一个数据框。

现在,我正在使用嵌套的 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}  
          }
        }

我假设有一个 apply 函数可以加快速度,但我似乎无法让它工作......非常感谢所有帮助!

【问题讨论】:

  • 查看包data.table及其foverlaps函数。
  • 你确定这段代码能正常工作吗? period$int[j] 是 if else 子句中的类数字,%within% 不起作用。
  • 看起来使用 dput 输出使用 lubridate 包创建的数据不起作用。我将编辑帖子以使可重现的数据更清晰
  • @Roland 我一直遇到 foverlaps 问题,但我认为这可能是解决方案。您对如何开始有什么建议吗?

标签: r for-loop data.table lubridate


【解决方案1】:

我即兴创作了一个适用于我的案例的解决方案,因此我会在此处发布它,以防其他人发现自己处于类似的困境中。

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"))

它不漂亮,但它适用于我的情况。

【讨论】:

    猜你喜欢
    • 2018-03-30
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2016-09-15
    • 1970-01-01
    相关资源
    最近更新 更多