2015-01-05 3 views
0

Я пытаюсь написать функцию, которая объединяется на основе двух столбцов, найденных в двух данных. Один из столбцов - строка идентификатора, а другая - дата.Итерация по месяцам с lubridate и объединением в сочетании

Первый df («модель») включает идентификаторы, даты начала и другую соответствующую информацию.

Второй df («futurevalues») является расплавленным df, который включает в себя идентификатор, несколько месяцев для каждого идентификатора и соответствующее значение для каждой пары идентификатор-месяц.

Я хотел бы объединить значения для каждого идентификатора в зависимости от определенного периода времени в будущем. Например, для Identifier = Mary и начального месяца = «2005-01-31» в «модели» я хотел бы получить соответствующее значение в течение следующего месяца и еще через 11 месяцев (так что 12 точек данных для Mary в течение нескольких месяцев начальный месяц + 1: начальный месяц + 12).

Я могу объединить свои dfs двумя столбцами, чтобы получить значение даты (см. Ниже), но это не то, что мне нужно.

testmerge=merge(model,futurevalues,by=c("month","identifier"),all=TRUE) 

Чтобы решить эту проблему, я пытаюсь использовать функции даты lubridate. Например, приведенная ниже функция позволит мне ввести месяц (а затем, возможно, через df, возможно), чтобы получить значения для каждого из начальных месяцев (которые различаются по df, а это означает, что это не стандартный период времени во всем).

monthiterate=function (x) { 
x %m+% months(1:12) 
} 

Большое спасибо за помощь.

EDIT: добавление игрушечные данных (первая одна модель, второй один futurevalues)

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)) 
+1

Просьба сделать это воспроизводимым, добавив свои данные. – nrussell

+0

К сожалению, конфиденциальность данных не позволяет мне это делать. Я могу придумать некоторые данные о игрушке, если это будет полезно –

+0

Это будет работать нормально. – nrussell

ответ

2

Вы должны создать таблицу всех комбинаций 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 

Теперь добавьте строки для следующих двух месяцев, за ID. Я использую dplyr для такого рода вещей.

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 

Теперь вы можете использовать merge() (или left_join() от dplyr), чтобы получить строки, которые вы хотите из полного набора данных.

+0

Спасибо, мой компьютер слишком дерьмовый, чтобы установить dplyr, но я использовал reshape, чтобы получить длинный формат с точками данных, которые мне нужны. –