У меня есть массив данных, который содержит некоторую информацию о людях и проектах как таковых:
person_id | project_id | action | time
--------------------------------------
1 | 1 | w | 1
1 | 2 | w | 2
1 | 3 | w | 2
1 | 3 | r | 3
1 | 3 | w | 4
1 | 4 | w | 4
2 | 2 | r | 2
2 | 2 | w | 3
Я хотел бы дополнить эти данные парой дополнительных полей с именами «first_time» и «first_time_project», которые в совокупности определяют первый раз, когда любое действие этого человека было замечено, и первый раз, когда разработчик увидел какое-либо действие в проекте. В итоге данные должны выглядеть так:
person_id | project_id | action | time | first_time | first_time_project
------------------------------------------------------------------------
1 | 1 | w | 1 | 1 | 1
1 | 2 | w | 2 | 1 | 2
1 | 3 | w | 2 | 1 | 2
1 | 3 | r | 3 | 1 | 2
1 | 3 | w | 4 | 1 | 2
1 | 4 | w | 4 | 1 | 4
2 | 2 | r | 2 | 2 | 2
2 | 2 | w | 3 | 2 | 2
Мой наивный способ написать пару циклов:
for (pid in unique(data$person_id)) {
data[data$pid==pid, "first_time"] = min(data[data$pid==pid, "time"])
for (projid in unique(data[data$pid==pid, "project_id"])) {
data[data$pid==pid & data$project_id==projid, "first_time_project"] = min(data[data$pid==pid & data$project_id==projid, "time"]
}
}
Теперь, не нужно быть гением, чтобы увидеть, что это будет медленно, с двойными вложенными циклами. Тем не менее, я не могу найти способ справиться с этим в R. Я вроде эмулирую группу опцией для SQL. Я знаю, что это может помочь, но я не могу понять, как сделать несколько слайсов.
Есть какие-нибудь подсказки о том, как перевести мой код с ледяной скорости на что-то более быстрое? Я был бы счастлив с улиткой прямо сейчас.