【发布时间】:2012-09-18 10:01:19
【问题描述】:
我正在处理我 11 年以上临床实践的账单记录的大型数据集。相当多的行缺少转诊医生。但是,使用一些规则我可以很容易地填写它们,但不知道如何在 R 下的 data.table 中实现它。我知道 zoo 包中有 na.locf 和数据中的 self rolling join 之类的东西。表包。我看到的例子太简单了,对我没有帮助。
这里有一些虚构的数据来指导你(作为 dput ASCII 文本表示)
structure(list(patient.first.name = structure(c(1L, 1L, 1L, 1L,
1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("John", "Kathy",
"Timothy"), class = "factor"), patient.last.name = structure(c(3L,
3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("Jones",
"Martinez", "Squeal"), class = "factor"), medical.record.nr = c(4563455,
4563455, 4563455, 4563455, 4563455, 2663775, 2663775, 2663775,
2663775, 2663775, 3330956, 3330956, 3330956, 3330956), date.of.service = c(39087,
39112, 39112, 39130, 39228, 39234, 39244, 39244, 39262, 39360,
39184, 39194, 39198, 39216), procedure.code = c(44750, 38995,
40125, 44720, 44729, 44750, 38995, 40125, 44720, 44729, 44750,
44729, 44729, 44729), diagnosis.code.1 = c(456.87, 456.87, 456.87,
456.87, 456.87, 521.37, 521.37, 521.37, 521.37, 356.36, 456.87,
456.87, 456.87, 456.87), diagnosis.code.2 = c(413, 413, 413,
413, 413, 532.23, NA, NA, NA, NA, NA, NA, NA, NA), referring.doctor.first = structure(c(1L,
1L, 1L, 1L, 1L, 2L, 2L, 2L, NA, NA, NA, 1L, 1L, NA), .Label = c("Abe",
"Mark"), class = "factor"), referring.doctor.last = structure(c(1L,
1L, 1L, 1L, 1L, 2L, 2L, 2L, NA, NA, NA, 1L, 1L, NA), .Label = c("Newstead",
"Wydell"), class = "factor"), referring.docotor.zip = c(15209,
15209, 15209, 15209, 15209, 15222, 15222, 15222, NA, NA, NA,
15209, 15209, NA), some.other.stuff = structure(c(1L, 1L, 1L,
NA, 3L, NA, NA, 4L, NA, 6L, NA, 2L, 5L, NA), .Label = c("alkjkdkdio",
"cheerios", "ddddd", "dddddd", "dogs", "lkjljkkkkk"), class = "factor")), .Names = c("patient.first.name",
"patient.last.name", "medical.record.nr", "date.of.service",
"procedure.code", "diagnosis.code.1", "diagnosis.code.2", "referring.doctor.first",
"referring.doctor.last", "referring.docotor.zip", "some.other.stuff"
), row.names = c(NA, 14L), class = "data.frame")
显而易见的解决方案是在 refer.doctor.last 和 refer.doctor.first 上使用某种最后观察结转 (LOCF) 算法。但是,当它到达新患者时,它必须停止。换言之,LOCF 必须仅应用于由患者.first.name、患者.last.name、medical.record.nr 的组合标识的一位患者。另请注意,有些患者在第一次就诊时会错过转诊医生,这意味着必须向后进行一些观察。更复杂的是,一些患者会更换初级保健医生,因此可能会在更早的时候有一位转诊医生,而在以后可能会有另一位转诊医生。因此,该算法需要了解具有缺失值的行的日期顺序。
在动物园na.locf 我看不到一种简单的方法来对每个患者的 LOCF 进行分组。我看到的滚动连接示例在这里不起作用,因为我不能简单地取出缺少 refering.doctor 信息的行,因为我会丢失 date.of.service 和 procedure.code 等。我希望您能帮助我了解 R 如何填补我缺失的数据。
【问题讨论】:
-
您可以使用
ave(Data, [unique patient identifier], FUN=na.locf)对每位患者进行分组。您可以使用fromLast参数将顺序颠倒到na.locf。 -
@Farrel。我看到了您对我的答案提出的修改,但在我看到它之前,一个模组已经拒绝了它。它对我来说看起来非常好和正确!但是,只需添加一个新答案即可。认为这就是它可能被拒绝的原因。可以自己回答,我会投票给它。
标签: r data.table zoo missing-data