У меня есть набор данных, где для каждой группы у меня есть начальная и конечная даты. Я хочу превратить эти данные в один, где для каждого периода времени (месяца) у меня есть одна строка наблюдения для каждой группы.R Оптимальный способ создания временных рядов от дат начала и окончания для групп
Ниже приведен пример входных данных, группы идентифицируются идентификатором:
structure(list(id = c(723654, 885618, 269861, 1383642, 250276,
815511, 1506680, 1567855, 667345, 795731), startdate = c("2008-06-29",
"2008-12-01", "2006-09-27", "2010-02-03", "2006-08-31", "2008-09-10",
"2010-04-11", "2010-05-15", "2008-04-12", "2008-08-28"), enddate = c("2008-08-13",
"2009-02-08", "2007-10-12", "2010-09-09", "2007-06-30", "2010-04-27",
"2010-04-13", "2010-05-16", "2010-04-20", "2010-03-09")), .Names = c("id",
"startdate", "enddate"), class = "data.frame", row.names = c("1",
"2", "3", "4", "6", "7", "8", "9", "10", "11"))
Я написал функцию и векторизован его. Функция принимает три параметра, хранящихся в каждой строке, и генерирует временные ряды с идентификаторами групп.
genDateRange<-function(start, end, id){
dates<-seq(as.Date(start), as.Date(end), by="month")
return(cbind(month=as.character(dates), id=rep(id, length(dates))))
}
genDataRange<-Vectorize(genDateRange)
Я запускаю функцию следующим образом, чтобы получить фрейм данных. У меня более 6M строк на выходе, так что это длится вечно. Мне нужен более быстрый способ.
range<-do.call(rbind,genDataRange(dat$startdate, dat$enddate, dat$id))
Первые десять строк вывода выглядит следующим образом:
structure(c("2008-06-29", "2008-07-29", "2008-12-01", "2009-01-01",
"2009-02-01", "2006-09-27", "2006-10-27", "2006-11-27", "2006-12-27",
"2007-01-27", "723654", "723654", "885618", "885618", "885618",
"269861", "269861", "269861", "269861", "269861"), .Dim = c(10L,
2L), .Dimnames = list(NULL, c("month", "id")))
Я был бы признателен за более быстрый способ сделать это. Я думаю, что я слишком много сосредоточился на чем-то и пропустил гораздо более простое решение.
Сколько времени навсегда? сколько данных у вас есть – rawr
ваши первые 10 строк вывода не совсем правильные, должно быть 2 столбца – C8H10N4O2
. бит Dim = c (10L, 2L) создает два столбца. – PoorLifeChoicesMadeMeWhoIAm