使用lubridate和merge组合按月迭代

使用lubridate和merge组合按月迭代,r,loops,merge,lubridate,R,Loops,Merge,Lubridate,我正在尝试编写一个函数,该函数基于两个数据帧中的两列进行合并。其中一列是标识符字符串,另一列是日期 第一个df(“模型”)包括标识符、开始日期和一些其他相关信息 第二个df(“futurevalues”)是一个融合的df,包括标识符、每个标识符的多个月以及每个标识符-月对的相关值 我希望根据将来的某个时间段合并每个标识符的值。例如,对于“model”中的Identifier=Mary和start month=“2005-01-31”,我希望为下个月和之后的11个月提取相关值(因此,对于Mary,

我正在尝试编写一个函数,该函数基于两个数据帧中的两列进行合并。其中一列是标识符字符串,另一列是日期

第一个df(“模型”)包括标识符、开始日期和一些其他相关信息

第二个df(“futurevalues”)是一个融合的df,包括标识符、每个标识符的多个月以及每个标识符-月对的相关值

我希望根据将来的某个时间段合并每个标识符的值。例如,对于“model”中的Identifier=Mary和start month=“2005-01-31”,我希望为下个月和之后的11个月提取相关值(因此,对于Mary,从月份+1开始的月份,有12个数据点:从月份+12开始)

我可以通过两列合并dfs以获得截止日期值(见下文),但这不是我需要的

testmerge=merge(model,futurevalues,by=c("month","identifier"),all=TRUE)
为了解决这个问题,我尝试使用lubridate函数。例如,下面的函数将允许我输入一个月(然后可能在df中使用lappy)来获取每个开始月份的值(在df中不同,这意味着它不是整个事件的标准时间段)

非常感谢你的帮助

编辑:添加玩具数据(第一个是模型,第二个是未来值)


您需要创建一个包含所需ID和月份的所有组合的表。从每个ID及其起始月份的表格开始:

library(lubridate)
set.seed(1834)
# 3 people, each with a different starting month
x <- data.frame(id = sample(LETTERS, 3)
                , month = ymd("2005-01-01") + months(sample(0:11, 3)) - days(1))

> x
  id      month
1  D 2005-03-31
2  R 2005-07-31
3  Y 2005-02-28

现在,您可以使用
merge()
(或
dplyr
中的
left_join()
)从完整数据集中检索所需的行。

请通过添加数据使其可复制。不幸的是,数据的机密性阻止了我这样做。如果有帮助的话,我可以提供一些玩具数据,这样就行了。添加的示例数据反映了两个DFS的一般结构。您的第二个数据集与第一个数据集相同,但列已交换。谢谢,我的计算机太糟糕,无法安装dplyr,但我使用了“重塑”来获得包含所需数据点的长格式。
structure(list(month = structure(c(12814, 12814, 12814, 12814, 
12814, 12814, 12814, 12814, 12814, 12814), class = "Date"), identifier = structure(c(1L, 
3L, 2L, 4L, 5L, 7L, 8L, 6L, 9L, 10L), .Label = c("AB1", "AC5", 
"BB9", "C99", "D81", "GG8", "Q11", "R45", "ZA1", "ZZ9"), class = "factor"), 
value = c(0.831876072999969, 0.218494398256579, 0.550872926656984, 
1.81882711231324, -0.245597705276932, -0.964277509916354, 
-1.84714556574606, -0.916239506529079, -0.475649743547525, 
-0.227721186387637)), .Names = c("month", "identifier", "value"
 ), class = "data.frame", row.names = c(NA, 10L))

 structure(list(identifier = structure(c(1L, 3L, 2L, 4L, 5L, 7L, 
 8L, 6L, 9L, 10L), .Label = c("AB1", "AC5", "BB9", "C99", "D81", 
 "GG8", "Q11", "R45", "ZA1", "ZZ9"), class = "factor"), month = structure(c(12814, 
 13238, 12814, 12814, 12964, 12903, 12903, 12842, 13148, 13148
 ), class = "Date"), futurereturns = c(-0.503033205660682, 1.22446988772542, 
 -0.825490985851348, 1.03902417581908, 0.172595565260429, 0.894967582911769, 
 -0.242324006922964, 0.415520398113024, -0.734437328639625, 2.64184935856802
 )), .Names = c("identifier", "month", "futurereturns"), class = "data.frame", row.names      
 = c(NA, 10L))
library(lubridate)
set.seed(1834)
# 3 people, each with a different starting month
x <- data.frame(id = sample(LETTERS, 3)
                , month = ymd("2005-01-01") + months(sample(0:11, 3)) - days(1))

> x
  id      month
1  D 2005-03-31
2  R 2005-07-31
3  Y 2005-02-28
library(dplyr)
y <- x %>%
  rowwise %>%
  do(data.frame(id = .$id
                , month = seq(.$month + days(1)
                              , by = "1 month"
                              , length.out = 3) - days(1)))

> y
Source: local data frame [9 x 2]
Groups: <by row>

  id      month
1  D 2005-03-31
2  D 2005-04-30
3  D 2005-05-31
4  R 2005-07-31
5  R 2005-08-31
6  R 2005-09-30
7  Y 2005-02-28
8  Y 2005-03-31
9  Y 2005-04-30