У меня есть массив данных, который содержит некоторую информацию о людях и проектах как таковых:
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. Я знаю, что это может помочь, но я не могу понять, как сделать несколько срезов.
Любые подсказки о том, как превратить мой код из ледяного медленного во что-то немного более быстрое? Я был бы счастлив с улиткой прямо сейчас.