【问题标题】:R function that returns value based on Date?基于日期返回值的R函数?
【发布时间】:2021-06-13 21:26:23
【问题描述】:

我有 2 个数据集,每个数据集有 2 列。在这两个集合中,列是日期和值。数据集 1 是最后一个日期为 06-10 的实际记录值。数据集 2 是数据集 1 中所有日期的预测值,以及未来日期(6-11、6-12、6-13 等)的附加行。

例如,


d1_date <- c('2021-06-08', '2021-06-09', '2021-06-10')
d1_value <- c(1, 2, 3)
d1 <- data.frame(d1_date, d1_value)

d2_date <- c('2021-06-08', '2021-06-09', '2021-06-10', '2021-06-11', '2021-06-12', '2021-06-13')
d2_value <- c(3, 2, 5, 4, 5, 6)
d2 <- data.frame(d2_date, d2_value)

现在我有一个从 '2021-06-08' 到 '2021-06-13' 的日期列表,我想将 d1 值放入日期 06-08 到 06-10 以及 d2 中的值到 06-11 到 06-13,这样新数据帧对应的值为 1, 2, 3, 4, 5, 6。

我在下面有一个函数:

fb_fb3 <- function(date) {
  
  date <- as.Date(date)
  
  ifelse(date <= max(d1$d1_date), return(d1$d1_value[d1$d1_date %in% date]), return(d2$d2_value[d2$d2_date %in% date]))

}

这有点工作,因为当我在函数中输入从 06-08 到 06-13 的日期列表时,它会给出我在 ifelse 中首先提到的任何数据帧的所有值。

当我先放入d1时,我无法绑定它,因为它只返回3个值,而不是6。当我放入d2时,我可以绑定它,但值将是3,2,5,4,5 ,6.

我无法将 d1 和 d2 的值组合起来得到 1、2、3、4、5、6。有人可以给一些建议吗?谢谢!

【问题讨论】:

  • ifelse 要求所有参数的长度相同。此外,return 应该在ifelse 之外。可能你需要if/else 而不是ifelse
  • if/else 是指 if(.){.} else{.} 吗?这给出了与我第一次尝试相同的问题,并且在另一个论坛上我看到了使用 ifelse 的建议。你能详细说明一下吗?我现在可以使用一个函数,通过使用一个连接然后用特定的日期字符串替换 NAs。但绝对不是最优的,因为数据每周都会刷新,我必须用更多的数据集重复这个函数。
  • 试试我发布的解决方案。

标签: r function date


【解决方案1】:

我们可以使用if/else 然后Vectorize 函数

fb_fb3 <- function(date) {
  if(!inherits(date, 'Date'))
    date <- as.Date(date)
  if(!inherits(d1$d1_date, "Date"))
    d1$d1_date <- as.Date(d1$d1_date)
  if(!inherits(d2$d2_date, "Date"))
    d2$d2_date <- as.Date(d2$d2_date)
    
    
  if(date <= max(d1$d1_date)) 
    with(d1, d1_value[d1_date %in% date])
  else 
     with(d2, d2_value[d2_date %in% date])
 }

-输入日期

dates <- seq(as.Date( '2021-06-08'), as.Date('2021-06-13'), by = '1 day')  

-测试

Vectorize(fb_fb3)(dates)
#[1] 1 2 3 4 5 6

【讨论】:

    【解决方案2】:

    使用 join 和 coalesce 怎么样?

    library(dplyr)
    
    d1 %>%
      full_join(d2, by = c('d1_date' = 'd2_date')) %>%
      transmute(date = d1_date, 
                value = coalesce(d1_value, d2_value))
    
    #        date value
    #1 2021-06-08     1
    #2 2021-06-09     2
    #3 2021-06-10     3
    #4 2021-06-11     4
    #5 2021-06-12     5
    #6 2021-06-13     6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      相关资源
      最近更新 更多