R-在数据框的行之间添加行

R-Adding rows between rows of a data frame

我有一个如下所示的数据框:

后两行显示患者入院后 3 小时和 63 小时的白蛋白实验室值。在这两行之间,我想添加 59 个新行,每次将 HoursFromAdmitLab 值递增 1,这样我在入院后每小时都有一行。对于第一行和第二行之间的 59 个新添加的行,我想重复每一列的第一行值,但我希望 AbnormalityCodeValue 为 NA 并且如前所述,HoursFromAdmitLab 每行加1。

所以我想在入院后的每个小时都有一行 (HoursFromAdmitLab),对于没有参加实验室的时间,我希望 ValueAbnormalityCode 作为 NA意味着没有可用的值。我的结果数据框的第二行应该是这样的:

我想在第二行和第三行之间重复这个过程,依此类推。我试着用一个循环来解决这个问题,但它需要永远,我知道应该有更好的方法。

实现此目的的一种可能方法是使用两个不同的联接:

  1. 加入应该填充的列
  2. 加入应使用滚动联接填充的列

data.table 包用于此目的,因为 OP 表示性能可能对其设置至关重要。

library(data.table) # CRAN version 1.10.4

# make sure data is in correct order
setorder(setDT(DT), GUID, Hours)

# create sequence of hours for each case
Hours <- DT[, .(Hours = seq(min(Hours), max(Hours))), by = GUID]

# 1st join with columns which should not be filled
tmp <- DT[, c("GUID", "Hours", "Value", "AbnormCode")][Hours, on = c("GUID", "Hours")]

# 2nd, rolling join with columns which should be filled
result <- DT[, -c("Value", "AbnormCode")][tmp, on = .(GUID, Hours), roll = TRUE]

result
#            GUID BirthYearNum GenderCode Hours Value AbnormCode
#  1: 27632200200         1949     Female     3   4.3          N
#  2: 27632200200         1949     Female     4    NA         NA
#  3: 27632200200         1949     Female     5    NA         NA
#  4: 27632200200         1949     Female     6    NA         NA
#  5: 27632200200         1949     Female     7    NA         NA
# ---                                                           
#273: 27632200200         1949     Female   275    NA         NA
#274: 27632200200         1949     Female   276    NA         NA
#275: 27632200200         1949     Female   277    NA         NA
#276: 27632200200         1949     Female   278    NA         NA
#277: 27632200200         1949     Female   279   3.0          L

请注意,该方法依赖于 GUID 作为唯一键,即假设必须为每个 GUID.

创建一个单独的序列

数据

由于 OP 未能提供可重现的数据,因此使用了以下数据:

library(data.table)
DT <- data.table(
  GUID = "27632200200",
  BirthYearNum = 1949L,
  GenderCode = "Female",
  Hours = c(3, 63, 111, 159, 231, 279),
  Value = c(4.3, 3.8, 3.6, 3.3, 3, 3),
  AbnormCode = c(rep("N", 3), rep("L", 3))
)
DT
#          GUID BirthYearNum GenderCode Hours Value AbnormCode
#1: 27632200200         1949     Female     3   4.3          N
#2: 27632200200         1949     Female    63   3.8          N
#3: 27632200200         1949     Female   111   3.6          N
#4: 27632200200         1949     Female   159   3.3          L
#5: 27632200200         1949     Female   231   3.0          L
#6: 27632200200         1949     Female   279   3.0          L

请注意,HoursFromAdmitLab 已缩写为 HoursAbnormalityCode 已缩写为 AbnormCode