У меня есть кадр данных, где каждая строка имеет уникальный идентификатор. Мне нужно реплицировать каждую из этих строк в зависимости от количества дней между датой начала и максимальной датой окончания и датой утверждения.R-петли - есть ли более эффективный способ?
ID <- c(1,2)
Value <- c(10,20)
StartDate <- c(as.Date("01/01/2015", '%d/%m/%Y'),
as.Date("01/01/2015", '%d/%m/%Y'))
EndDate <- c(as.Date("31/01/2015", '%d/%m/%Y'),
as.Date("15/01/2015", '%d/%m/%Y'))
AppDate <- c(as.Date("15/01/2015", '%d/%m/%Y'),
as.Date("15/02/2015", '%d/%m/%Y'))
df <- data.frame(ID, Value, StartDate, EndDate, AppDate)
df <- df[rep(row.names(df), ifelse(as.numeric(df$AppDate) >
as.numeric(df$EndDate),as.numeric(df$AppDate-df$StartDate),
as.numeric(df$EndDate-df$StartDate)) + 1),]
Затем мне нужно добавить последовательный список дат от даты начала до максимальной даты окончания или даты утверждения.
Я сделал это через 2 петли. Внешний контур проходит через кадр данных для каждого уникального идентификатора. Второй цикл затем проходит через идентификатор и добавляет дату. Как только второй цикл завершен, он передает строку во внешний цикл в качестве новой начальной точки.
IDs <- unique(df$ID)
df$Days <- rep(as.Date("01/01/1999",'%d/%m/%Y'), nrow(df))
counter <- 1
for (i in 1:length(IDs)) {
ref <- IDs[i]
start <- 1
while (df$ID[counter] == ref) {
ifelse(start == 1, df$Days[counter] <- df$StartDate[counter],
df$Days[counter] <- df$StartDate[counter] + start -1)
ifelse (counter > nrow(df), break, counter <- counter + 1)
ifelse (counter > nrow(df), break, start <- start + 1)
}
}
Мой фактический набор данных имеет более 6000 идентификаторов и один раз я копировала строки он заканчивает тем, что более 500000 строк. Цикл занял более 15 минут, поэтому он явно неэффективен.
Итак, у меня есть 2 вопроса.
1). Каков наиболее эффективный способ сделать это в R
2). Что бы наиболее эффективный способ сделать это в общем-то в что-то вроде C++
благодаря
Я считаю, что 'data.table' ответ в этом Q & A обеспечивает общий принцип эффективного решения: [Expanding последовательность в кадре данных] (http://stackoverflow.com/questions/11494511/расширения-а-последовательность-в-данных-кадра? LQ = 1). Google «R expand date data.table» должен содержать несколько аналогичных примеров. – Henrik