【问题标题】:R-Adding rows between rows of a data frame [closed]R-在数据框的行之间添加行[关闭]
【发布时间】:2017-05-16 00:01:44
【问题描述】:

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

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

因此,我希望在入院后的每一小时 (HoursFromAdmitLab) 有一个行,并且对于未进行实验室的时间,我希望 ValueAbnormalityCode 为 NA,这意味着没有可用的值。我的结果数据框的第二行应该是这样的:

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

【问题讨论】:

  • tidyr::complete,也许fill
  • 请以纯文本而非图像的形式提供数据,以便用户轻松复制/粘贴。试试dput(yourDataFrame),如果很大,试试dput(head(yourDataFrame))

标签: r loops dataframe apply tidyr


【解决方案1】:

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

  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

【讨论】:

  • 这是一个如此快速和优雅的解决方案,而且效果很好。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
相关资源
最近更新 更多