我正在试图弄清楚如何在我的数据集中添加一个列,其中包括基于每个患者中的日期的唯一事件计数。这是我的数据集的一部分:
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并且其他是新约会事件的整数。
我尝试在堆栈溢出时寻找类似的问题,但没有任何运气。
非常感谢!
答案 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