我有2个数据集,每个数据集有2列。在这两个集合中,列是Date和Value。数据集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。有人能给我一些建议吗?谢谢!
发布于 2021-06-14 06:55:49
我们可以使用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])
}-input日期
dates <- seq(as.Date( '2021-06-08'), as.Date('2021-06-13'), by = '1 day') -testing
Vectorize(fb_fb3)(dates)
#[1] 1 2 3 4 5 6发布于 2021-06-14 12:00:31
使用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 6https://stackoverflow.com/questions/67962772
复制相似问题