gpt4 book ai didi

r - 按类别填充数据表中的缺失(空白) - 向后和向前

转载 作者:行者123 更新时间:2023-12-03 14:33:35 29 4
gpt4 key购买 nike

我正在为我 11 年的临床实践处理大量账单记录数据集。相当多的行缺少转诊医生。但是,使用一些规则我可以​​很容易地填写它们,但不知道如何在R下的data.table中实现它。我知道zoo包中有na.locf和data.table包中的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")

显而易见的解决方案是在referring.doctor.last 和referring.doctor.first 上使用某种最后观察结转(LOCF)算法。但是,当它到达新患者时,它必须停止。换言之,LOCF 必须仅应用于由患者.first.name、患者.last.name、medical.record.nr 的组合标识的一位患者。另请注意,有些患者在第一次就诊时就错过了转诊医生,这意味着必须将一些观察结果 向后 进行。更复杂的是,一些患者会更换初级保健医生,因此可能会在更早的时候有一位转诊医生,而在以后可能会有另一位转诊医生。因此,该算法需要了解具有缺失值的行的日期顺序。

在动物园 na.locf 中,我看不到对每位患者的 LOCF 进行分组的简单方法。我见过的滚动连接示例在这里不起作用,因为我不能简单地取出缺少 refering.doctor 信息的行,因为我会丢失 date.of.service 和 procedure.code 等。我希望您能帮助我了解 R 如何填补我缺失的数据。

最佳答案

一个更简洁的例子会更容易回答。例如,您包含了相当多的列,这些列似乎是多余的。它真的需要按名字和姓氏,还是我们可以使用患者编号?

既然你已经有 NA s 在你想填写的数据中,它不是 rolldata.table真的。当您的数据没有 NA 时,滚动连接更适用。但是您有另一个时间序列(例如)连接到数据之间的位置。 (一个效率优势是您无需先创建 NA,然后您必须填写第二步。)或者,换句话说,在您的问题中,您只有一个数据集;你没有加入两个。

所以你确实需要na.locf正如@Joshua 建议的那样。我不知道填充 NA 的函数但是,向前然后向后的第一个值。

data.table , 使用 na.locf按组只是:

require(data.table)
require(zoo)
DT[,doctor:=na.locf(doctor),by=patient]

具有快速聚合和引用更新的效率优势。您必须在 na.locf 之上编写一个新的小函数滚动第一个非 NA向后。

确保数据首先按患者排序,然后按日期排序。那么以上将应付医生随着时间的变化,因为 by维护每个组内的行顺序。

希望能给你一些提示。

关于r - 按类别填充数据表中的缺失(空白) - 向后和向前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12607465/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com