我有一个数据数组,其中包含有关人员和项目的一些信息,例如:
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 的 group by 选项。我知道 by 可能会有所帮助,但我不知道如何做多个切片。
关于如何将我的代码从冰冷的速度提升到更快的任何提示?我现在对蜗牛很满意。