如何在R中的个体内为不同的观察日期添加一个独特的场合?

时间:2013-11-21 18:45:33

标签: r

我正在试图弄清楚如何在我的数据集中添加一个列,其中包括基于每个患者中的日期的唯一事件计数。这是我的数据集的一部分:

    trialno     event          date          time
3   11301   pm_intake   2010-11-24  19:00
4   11301   am_intake   2010-11-25  07:00
5   11301   pk1         2010-11-25  10:30
6   11301   pm_intake   2010-12-22  19:00
7   11301   am_intake   2010-12-23  07:00
8   11301   pk1         2010-12-23  09:54
9   11301   pk2         2010-12-23  13:07
10  11301   pm_intake   2011-02-02  19:00
11  11301   am_intake   2011-02-03  07:00
12  11301   pk1         2011-02-03  11:30

基本上每个患者的每个日期都表明一个新的场合。如果患者只是给药 - 这是一次,但如果患者在同一天进行药物给药和两次测量,那么他们都算是相同的场合。数据集没有常规模式(每个患者在每个日期和事件总数上有不同数量的事件)。 我想要实现的是:

    trialno     event          date          time   OCC
3   11301   pm_intake   2010-11-24  19:00    1
4   11301   am_intake   2010-11-25  07:00    2
5   11301   pk1         2010-11-25  10:30    2
6   11301   pm_intake   2010-12-22  19:00    3
7   11301   am_intake   2010-12-23  07:00    4
8   11301   pk1         2010-12-23  09:54    4
9   11301   pk2         2010-12-23  13:07    4
10  11301   pm_intake   2011-02-02  19:00    5
11  11301   am_intake   2011-02-03  07:00    6
12  11301   pk1         2011-02-03  11:30    6

我认为我应该应用某种循环来识别每个患者的唯一日期并计算它们,但我不确定如何编写它,所以我尝试使用应用功能。

我考虑过首先使用拆分功能将整个数据集拆分为个体患者:

splitData<- split(data, data$trialno)

应用lapply并转换为添加新列OCC(场合)但我不知道如何将它们计为整数...

我在想:

splitData<- lapply(splitData, function(df) {
       transform(df, OCC= ???????????????   )}

do.call ("rbind", splitData)

我知道如何在Excell中做到这一点:

=IF(D5=D4, E4,E4+1)

(如果相邻单元格中的单元格值与上面单元格中的单元格值相同,那么我的单元格中的值与上面的单元格中的值相同,否则它会更大) - 这样E列中的第一个单元格必须为1并且其他是新约会事件的整数。

我尝试在堆栈溢出时寻找类似的问题,但没有任何运气。

非常感谢!

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望OCC指示每个试验编号的唯一日期,但是您希望为每个新的试验编号重新启动OCC为1。这可以使用data.table包最轻松地完成。

首先,我将生成一些包含多个试验数据的数据:

> dt0
   trialno     event       date  time
1    11301 pm_intake 2010-11-24 19:00
2    11301 am_intake 2010-11-25 07:00
3    11301       pk1 2010-11-25 10:30
4    11301 pm_intake 2010-12-22 19:00
5    11301 am_intake 2010-12-23 07:00
6    11301       pk1 2010-12-23 09:54
7    11301       pk2 2010-12-23 13:07
8    11301 pm_intake 2011-02-02 19:00
9    11301 am_intake 2011-02-03 07:00
10   11301       pk1 2011-02-03 11:30
11   11302       pk1 2011-02-03 11:30
12   11302       pk1 2011-02-03 11:40

可以像这样添加OCC列:

> require(data.table)
> dt<-data.table(dt0)
> dt[,OCC:=match(date,unique(date)),by=trialno]
> dt
    trialno     event       date  time OCC
 1:   11301 pm_intake 2010-11-24 19:00   1
 2:   11301 am_intake 2010-11-25 07:00   2
 3:   11301       pk1 2010-11-25 10:30   2
 4:   11301 pm_intake 2010-12-22 19:00   3
 5:   11301 am_intake 2010-12-23 07:00   4
 6:   11301       pk1 2010-12-23 09:54   4
 7:   11301       pk2 2010-12-23 13:07   4
 8:   11301 pm_intake 2011-02-02 19:00   5
 9:   11301 am_intake 2011-02-03 07:00   6
10:   11301       pk1 2011-02-03 11:30   6
11:   11302       pk1 2011-02-03 11:30   1
12:   11302       pk1 2011-02-03 11:40   1