基于标准的计数组- R

gijlo24d  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(95)

我有这个数据集

dt <- data.table(ID = c(1,1,2,3,4,5,5,6,7, 8, 9,9, 10, 10, 11, 12, 13,14, 15),
                 diagnosis = c("A", "B", "A", "B", "C", "A", "B", "A", "B", "C", "A", "A", "A", "B", "C", "A", "A", "A"),
                 Date = c("2013-01-01","2013-01-01","2010-01-12", "2013-01-12", "2013-01-26", "2010-01-02", "2010-01-02", "2010-01-14", "2011-01-12", "2012-01-12", "2010-01-12", "2013-01-02","2013-01-02","2010-01-12", "2013-01-12", "2013-01-26", "2013-01-14", "2013-01-28", "2020-01-01"))

我需要做一个统计每个诊断的表(A;乙;C)2013年(only_2013,仅在2013年诊断的患者)、2010 - 2012年(only_10_12,仅在该年期间诊断的患者)、在两个年份组中均诊断的患者(both)以及在2013年和2010 - 2012年均未诊断的患者(none,在本例中只有一个人)。如果一个人在同一天有两个诊断,那么它应该遵循这个优先级列表:1.如果诊断之一是A,那么A应该总是被计为他们的诊断2.如果他们具有B和C,那么B应该被计为他们的诊断所希望的输出应该是这样的表格,计数的数目作为值。

group  only_2013  only_10_12  both none
A                                
B                     
C

希望这是有道理的...

lc8prwob

lc8prwob1#

当您对诊断进行排序并仅在唯一日期进行时才包括它们时,关键步骤是在ID中按diagnosis排序,并标记那些ID重复的日期,以便从最终计数表中删除它们。

setorder(dt, ID, Date, diagnosis)
dt[, duplicate_diagnosis := duplicated(Date),
    by = .(ID)
]

之后,它只是一个简单的情况下,创建列的基础上,你设置的规则,然后总结这些列:

dt[, year := year(Date)]

dt[, `:=`(
    only_2013 = all(unique(year) %in% 2013),
    only_10_12 = all(year %in% 2010:2012),
    both = 2013 %in% year & any(2010:2012 %in% year),
    none = identical(setdiff(2010:2013, unique(year)), 2010:2013)
),
by = ID
]

dt[(!duplicate_diagnosis), lapply(.SD, sum),
    .SDcols = c("only_2013", "only_10_12", "both", "none"),
    by = diagnosis
]

#    diagnosis only_2013 only_10_12  both  none
#        <ord>     <int>      <int> <int> <int>
# 1:         A         6          3     3     1
# 2:         B         1          1     1     0
# 3:         C         2          1     0     0

注:我已经利用了诊断的字母顺序与您希望对其进行优先级排序的顺序相同这一事实。如果您的真实的数据不是这种情况,您可以通过将其作为因子并设置水平来设置顺序,例如:

dt[, diagnosis := factor(
    diagnosis,
    levels = c("A", "B", "C"),
    ordered = TRUE
)]

相关问题