当前位置 : 主页 > 手机开发 > 其它 >

在多个不同切片上应用聚合函数

来源:互联网 收集:自由互联 发布时间:2021-06-22
我有一个数据数组,其中包含有关人员和项目的一些信息: 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
我有一个数据数组,其中包含有关人员和项目的一些信息:

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选项.我知道也许可以提供帮助,但我无法弄清楚如何做多片.

关于如何将我的代码从冰冷的速度变慢到更快的东西的任何提示?我现在对蜗牛感到高兴.

试试大道:

transform(data, 
   first_time = ave(time, person_id, FUN = min),
   first_time_project = ave(time, person_id, project_id, drop = TRUE, FUN = min)
)
网友评论