【问题标题】:Copy a value from one person in a group to everyone in a group将组中一个人的值复制到组中的每个人
【发布时间】:2016-03-10 10:49:22
【问题描述】:

由于省略了处方信息,我有一个长格式的数据集(每个 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 中的控件,但我也不知道该怎么做。

【问题讨论】:

    标签: r date data.table


    【解决方案1】:

    您可以将每个set组内的第一个非空病日期复制到整列disease.date

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

    然后计算age

    dt[, age := disease.date - dob]
    

    请注意,时差间隔以天为单位。您可以将它们除以 365 或以任何其他合适的方式处理它们。也许包lubridate 在这里有用。在它的帮助下:

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

    dt[, age := decimal_date(disease.date) - decimal_date(dob)]
    

    【讨论】:

      【解决方案2】:

      你可以试试这个:

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

      考虑 dt$disease.date[20],因为 disease.date 列中有一些 NA。

      由于两列都是日期对象,R 会自动计算两个日期的差异。不同之处在于天数,因此除以 365 即可得出大致年龄。

      【讨论】:

      • 抱歉,我认为我的问题不够清楚。我现在已经编辑过了。您建议的代码只有在我有一组时才有效,但还有更多具有不同 disease.dates 的代码。
      • @Lb93 您是在读取列表中的不同数据集还是在不同的 data.frames 中?
      • 数据为data.table/data.frame格式,包含所有sets。我已经更正了示例以提供更多信息
      • @Lb93 抱歉,我帮不上什么忙。我仍然不确定数据集的结构。此外,数据集的 disease.date 列中的所有行都应该具有相同的 disease.date?在您共享的数据集中,有两个不同的 disease.date 值。您会使用哪个值来计算年龄?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      相关资源
      最近更新 更多