将组中一个人的值复制到组中的每个人

时间:2016-03-10 10:49:23

标签: r date data.table

由于省略处方信息,我有一个长格式的数据集(每个ID多次观察)。每个ID都是较大“集合”的一部分,并且有50个或更多集合都有一个患病ID。每组一个人患有这种疾病,而其他人则没有。

dt <- data.table(ID = rep(1:10, each = 4),
             disease = c(rep(0, 16), rep(1, 4), rep(0, 12), rep(1,4), rep(0,4)),
             dob = c(rep(as.Date("13/05/1924", "%d/%m/%Y"), 4), rep(as.Date("15/09/1936", "%d/%m/%Y"),4), 
                     rep(as.Date("30/06/1957", "%d/%m/%Y"),4), rep(as.Date("19/02/1946", "%d/%m/%Y"),4), 
                     rep(as.Date("26/04/1939", "%d/%m/%Y"),4), rep(as.Date("13/05/1922", "%d/%m/%Y"), 4), rep(as.Date("18/10/1945", "%d/%m/%Y"),4), 
                     rep(as.Date("30/06/1957", "%d/%m/%Y"),4), rep(as.Date("19/02/1946", "%d/%m/%Y"),4), 
                     rep(as.Date("26/12/1939", "%d/%m/%Y"),4)),
             disease.date = c(rep(as.Date("01/01/2000", "%d/%m/%Y"), 16), rep(as.Date("19/02/2006", "%d/%m/%Y"),4),
                              rep(as.Date("01/01/2000", "%d/%m/%Y"), 12), rep(as.Date("13/11/2010", "%d/%m/%Y"),4),
                              rep(as.Date("01/01/2000", "%d/%m/%Y"), 4)),
             set = c(rep(1,20), rep(2,20)))
dt <- dt[(disease==0), disease.date:=NA]
dt
    ID disease   dob      disease.date   set
 1:  1    0   1924-05-13      <NA>        1
 2:  1    0   1924-05-13      <NA>        1
 3:  1    0   1924-05-13      <NA>        1
 4:  1    0   1924-05-13      <NA>        1
 5:  2    0   1936-09-15      <NA>        1
 6:  2    0   1936-09-15      <NA>        1
 7:  2    0   1936-09-15      <NA>        1
 8:  2    0   1936-09-15      <NA>        1
 9:  3    0   1957-06-30      <NA>        1
10:  3    0   1957-06-30      <NA>        1
11:  3    0   1957-06-30      <NA>        1
12:  3    0   1957-06-30      <NA>        1
13:  4    0   1946-02-19      <NA>        1
14:  4    0   1946-02-19      <NA>        1
15:  4    0   1946-02-19      <NA>        1
16:  4    0   1946-02-19      <NA>        1
17:  5    1   1939-04-26   2006-02-19   1
18:  5    1   1939-04-26   2006-02-19   1
19:  5    1   1939-04-26   2006-02-19   1
20:  5    1   1939-04-26   2006-02-19   1
21:  6       0 1922-05-13         <NA>   2
22:  6       0 1922-05-13         <NA>   2
23:  6       0 1922-05-13         <NA>   2
24:  6       0 1922-05-13         <NA>   2
25:  7       0 1945-10-18         <NA>   2
26:  7       0 1945-10-18         <NA>   2
27:  7       0 1945-10-18         <NA>   2
28:  7       0 1945-10-18         <NA>   2
29:  8       0 1957-06-30         <NA>   2
30:  8       0 1957-06-30         <NA>   2
31:  8       0 1957-06-30         <NA>   2
32:  8       0 1957-06-30         <NA>   2
33:  9       1 1946-02-19   2010-11-13   2
34:  9       1 1946-02-19   2010-11-13   2
35:  9       1 1946-02-19   2010-11-13   2
36:  9       1 1946-02-19   2010-11-13   2
37: 10       0 1939-12-26         <NA>   2
38: 10       0 1939-12-26         <NA>   2
39: 10       0 1939-12-26         <NA>   2
40: 10       0 1939-12-26         <NA>   2

我有兴趣在疾病发病日期找到该组患者的年龄。 例如,2006年2月19日(病例发病日期)第1组中的每个人多大了?在2010年11月13日的第2集中?

我已尝试过data.table方式:

cc[, age := dob - oa.cons.date, by = set]

仅适用于disease.date

的人

其他任何想法都涉及将每个案例的disease.date复制到同一个set中的控件,但我也不知道该怎么做。

2 个答案:

答案 0 :(得分:4)

您可以将每个SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length组中的第一个非空疾病日期复制到整个列set

disease.date

然后计算dt[, disease.date := disease.date[!is.na(disease.date)][1], by = set]

age

请注意,时差间隔以天为单位。您可以将它们除以365或以任何其他合适的方式对待它们。也许包dt[, age := disease.date - dob] 在这里很有用。有了它的帮助:

lubridate

dt[, age := as.period(interval(dob, disease.date), unit = "years")]

答案 1 :(得分:0)

你可以试试这个:

(dt$dob - dt$disease.date[20])/365

采取dt $ disease.date [20],因为在疾病专栏中有一些新的。

由于两列都是日期对象,因此R会自动计算两个日期的差异。差异将以天为单位,因此除以365就可以得出大致的年龄。