У меня есть лог-файл с 130000 строками. Каждая строка содержит CaseID, метку времени и код / фактор для действия. Фрейм данных упорядочен на CaseID, метка времени. Мне нужно изменить порядок данных таким образом, чтобы я получал все коды активности, принадлежащие одному делу, в одной строке вместе с CaseID
Пример:
df <- data.frame("CaseID" = c(1,1,3,2,1,4,2,3),
Activ = as.factor(c("A","B","A","C","D","C", "D", "C")))
CaseID Activ
1 1 A
2 1 B
3 3 A
4 2 C
5 1 D
6 4 C
7 2 D
8 3 C
следует преобразовать в:
[,1] [,2] [,3]
[1,] 1 2 4
[2,] 3 4 NA
[3,] 1 3 NA
[4,] 3 NA NA
После изменения кадра данных:
df %>% arrange(CaseID) %>% mutate(case_rank = cumsum(c(0,as.numeric(diff(as.numeric(CaseID)))!=0)) +1) %>% group_by(CaseID) %>% mutate(rank = 1:n()) %>% mutate(act_count = n()) -> df
Я реализовал 2 разных способа.
ptm <- proc.time()
Interim <- matrix(nrow = max(df$case_rank), ncol = max(df$rank))
for (i in 1:nrow(df)) {
Interim[df[[i, "case_rank"]], df[[i, "rank"]]] <- as.numeric(df[i, "Activ"])
}
Interim
print(proc.time() - ptm)
ptm <- proc.time()
cols <- max(df$act_count)
emptyrow <- rep(NA, cols)
df2 <- data.frame(matrix(NA, nrow = max(df$case_rank), ncol = cols))
for(row in 1:max(df$case_rank))
df2[row,] <- head(append(as.numeric(filter(df, CaseID == row)$Activ), emptyrow), cols)
m1 <- as.matrix(df2)
print(proc.time() - ptm)
После применения этого кода к исходному фрейму данных я получил следующие результаты:
user system elapsed
1.334 0.227 1.581
user system elapsed
3.182 1.126 4.351
Мой первый вопрос: почему второй метод такой медленный?
Второй вопрос: есть ли лучшие / альтернативные способы для этого?
Ben