Я использую R с пакетом data.table.У меня есть цикл, в котором рассчитывается количество, но, поскольку это цикл, он чрезвычайно медленный.Теперь я хочу как-то изменить его, чтобы вычисление не занимало дней.
У меня есть набор данных, и я хочу посчитать, как часто этот человек уже появляется в наборе данных.Когда имя, фамилия и дата рождения (день рождения, месяц рождения и год рождения) совпадают, это один и тот же «человек».Однако проблема в том, что дата тоже важна.Итак, если этот человек, на которого я смотрю, появляется в наборе данных, я должен проверить, не находится ли дата «того же человека» перед датой человека, на которого я смотрю.Следовательно, один и тот же человек должен быть известен раньше, чем тот, на кого я смотрю.
Затем я также хочу вычислить среднее время между этими записями.Вот мое текущее решение (которое работает, но очень медленно):
library(data.table)
data <- data[order(-persondatetime)]
vec_countperson <- numeric(nrow(data))
vec_time <- numeric(nrow(data))
for (i in 1:nrow(data)){
vec_countperson[i] <- data[firstname == data[i, firstname] &
surname == data[i, surname] &
birthdate == data[i, birthdate] &
persondatetime < data[i, persondatetime], .N]
vec_time[i] <- data[firstname == data[i, firstname] &
surname == data[i, surname] &
birthdate == data[i, birthdate] &
persondatetime < data[i, persondatetime],
mean(abs(diff(c(persondatetime, data[i, persondatetime]))))]
}
data[, countperson := vec_countperson]
data[, timebetweenentries := vec_time]
Пример data.table будет выглядеть следующим образом:
data <- data.table(
firstname = c("Paul", "Jens", "Jens", "Jens","Paul", "Dieter"),
surname = c("Mueller", "Mustermann", "Mustermann", "Mustermann", "Mueller", "Brian"),
birthdate = as.Date(c("1960-05-08", "1960-05-08", "1960-05-08",
"1960-05-08", "1960-05-08", "1960-05-08")),
persondatetime = as.POSIXct(c("2018-05-01 23:18:38 CET", "2018-03-01 23:18:38 CET",
"2018-06-01 23:18:38 CET", "2018-04-01 23:18:38 CET",
"2018-04-06 23:18:38 CET", "2018-04-08 23:18:38 CET")))
Ожидаемый результат:
firstname surname birthdate persondatetime countperson timebetweenentries
1: Jens Mustermann 1960-05-08 2018-03-01 23:18:38 0 NaN
2: Jens Mustermann 1960-05-08 2018-04-01 23:18:38 1 30.95833
3: Paul Mueller 1960-05-08 2018-04-06 23:18:38 0 NaN
4: Dieter Brian 1960-05-08 2018-04-08 23:18:38 0 NaN
5: Paul Mueller 1960-05-08 2018-05-01 23:18:38 1 25.00000
6: Jens Mustermann 1960-05-08 2018-06-01 23:18:38 2 45.97917
У вас есть идеи, как мне избежать петли?Я думал о других идеях, но моя проблема всегда связана с датой!