Задача состоит в том, чтобы эффективно извлекать события из этих данных:R: Эффективное извлечение событий (непрерывное увеличение переменной)
data <- structure(
list(i = c(1, 1, 1, 2, 2, 2), t = c(1, 2, 3, 1, 3, 4), x = c(1, 1, 2, 1, 2, 3)),
.Names = c("i", "t", "x"), row.names = c(NA, -6L), class = "data.frame"
)
> data
i t x
1 1 1 1
2 1 2 1
3 1 3 2
4 2 1 1
5 2 3 2
6 2 4 3
Давайте называть i
факты, t
время, и x
это число выборов от i
по адресу t
.
Событие представляет собой непрерывную последовательность выборов одного факта. Факт 1 выбирается все время от t = 1 до t = 3 с суммой из 4 выборок. Но факт 2 делится на два события: первый от t = 1 до t = 1 (sum = 1), а второй от t = 3 до t = 4 (sum = 5). Таким образом, кадр данных событий должен выглядеть следующим образом:
> event
i from to sum
1 1 1 3 4
2 2 1 1 1
3 2 3 4 5
Этот код делает то, что нужно:
event <- structure(
list(i = logical(0), from = logical(0), to = logical(0), sum = logical(0)),
.Names = c("i", "from", "to", "sum"), row.names = integer(0),
class = "data.frame"
)
l <- nrow(data) # get rows of data frame
c <- 1 # set counter
d <- 1 # set initial row of data to start with
e <- 1 # set initial row of event to fill
repeat{
event[e,1] <- data[d,1] # store "i" in event data frame
event[e,2] <- data[d,2] # store "from" in event data frame
while((data[d+1,1] == data[d,1]) & (data[d+1,2] == data[d,2]+1)){
c <- c+1
d <- d+1
if(d >= l) break
}
event[e,3] <- data[d,2] # store "to" in event data frame
event[e,4] <- sum(data[(d-c+1):d,3]) # store "sum" in event data frame
c <- 1
d <- d+1
e <- e+1
}
Проблема заключается в том, что этот код занимает 3 дня, чтобы извлечь события из данных кадр с 1 миллионом строк и мой кадр данных имеет 5 миллионов строк.
Как я могу сделать это более эффективным?
P.S .: В моем коде также имеется небольшая ошибка, связанная с завершением.
P.P.S .: Данные сортируются сначала i, затем по t.
Ваша первая реализация заняла 150 секунд вместо 15 дней для моих 5 миллионов строк :) Спасибо. Ваша вторая реализация, с которой я не мог работать. Я запустил первую строку, а затем «event <- data [...». Действительно ли код? Мне нравится пакет data.table. – hyco
Спасибо. Просто запустите код так, как есть. Не вводите больше данных о событиях. Table – chinsoon12
Можете ли вы проверить свою реализацию data.table? Когда я запускаю его, это похоже на то, что последняя строка не имеет никакого эффекта. Но раньше, ваш из колонки не имеет смысла для меня. – hyco