R-在数据框的行之间添加行
R-Adding rows between rows of a data frame
我有一个如下所示的数据框:
后两行显示患者入院后 3 小时和 63 小时的白蛋白实验室值。在这两行之间,我想添加 59 个新行,每次将 HoursFromAdmitLab
值递增 1,这样我在入院后每小时都有一行。对于第一行和第二行之间的 59 个新添加的行,我想重复每一列的第一行值,但我希望 AbnormalityCode
和 Value
为 NA 并且如前所述,HoursFromAdmitLab
每行加1。
所以我想在入院后的每个小时都有一行 (HoursFromAdmitLab
),对于没有参加实验室的时间,我希望 Value
和 AbnormalityCode
作为 NA意味着没有可用的值。我的结果数据框的第二行应该是这样的:
我想在第二行和第三行之间重复这个过程,依此类推。我试着用一个循环来解决这个问题,但它需要永远,我知道应该有更好的方法。
实现此目的的一种可能方法是使用两个不同的联接:
- 加入应该不填充的列
- 加入应使用滚动联接填充的列
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
已缩写为 Hours
,AbnormalityCode
已缩写为 AbnormCode
。
我有一个如下所示的数据框:
后两行显示患者入院后 3 小时和 63 小时的白蛋白实验室值。在这两行之间,我想添加 59 个新行,每次将 HoursFromAdmitLab
值递增 1,这样我在入院后每小时都有一行。对于第一行和第二行之间的 59 个新添加的行,我想重复每一列的第一行值,但我希望 AbnormalityCode
和 Value
为 NA 并且如前所述,HoursFromAdmitLab
每行加1。
所以我想在入院后的每个小时都有一行 (HoursFromAdmitLab
),对于没有参加实验室的时间,我希望 Value
和 AbnormalityCode
作为 NA意味着没有可用的值。我的结果数据框的第二行应该是这样的:
我想在第二行和第三行之间重复这个过程,依此类推。我试着用一个循环来解决这个问题,但它需要永远,我知道应该有更好的方法。
实现此目的的一种可能方法是使用两个不同的联接:
- 加入应该不填充的列
- 加入应使用滚动联接填充的列
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
已缩写为 Hours
,AbnormalityCode
已缩写为 AbnormCode
。