使用 RLE 删除每行的连续重复项并检查 R 中的序列逻辑
Remove consecutive duplicates per row with RLE and check logic of sequence in R
对于具有患者路径(例如到达 -> Area A -> 病房)的数据集,我有一个两步数据清理问题。这是数据的示例:
df <- data.frame(Patient = c(1,2,3,4,5),
Area1 = c("Arrival1", "Arrival1", "Arrival2", "Arrival1", "Arrival2"),
Area2 = c("Area A", "Diagnostics", "Area A", "Area B", NA),
Area3 = c("Area B", "Diagnostics", "Area B", "Area A", NA),
Area4 = c("Ward", "Ward", "Area B", "Area C", NA),
Area5 = c(NA, NA, "Ward", "Arrival", NA)
)
第 1 步:删除连续列中的重复项
有些患者在连续的列中有重复项,例如对于患者 2(诊断 -> 诊断)和患者 3(区域 B -> 区域 B)。我需要这些是独特的途径。
我已经使用 apply()
和 rle()
解决了这个问题:
df1 <- apply(df,1,rle)
但是,这给了我一个包含值和长度的(大)列表。如何将其传输回上述形式的数据框(即保留患者 ID 和值)?我尝试了 do.call
、rbindlist()
和 unlist()
的各种版本,但其中 none 似乎对我有用。
第 2 步:检查路径逻辑
假设我们现在有一个干净的数据集:
dfclean <- data.frame(Patient = c(1,2,3,4,5),
Area1 = c("Arrival1", "Arrival1", "Arrival2", "Arrival1", "Arrival2"),
Area2 = c("Area A", "Diagnostics", "Area A", "Area B", NA),
Area3 = c("Area B", "Ward", "Area B", "Area A", NA),
Area4 = c("Ward", NA, "Ward", "Area C", NA),
Area5 = c(NA, NA, NA, "Arrival", NA)
)
现在我需要检查路径的逻辑。为此,我有第二个数据集,其中列出了所有可能的路径,我需要根据数据集 2 检查数据集 1 中的每个路径是否“可能”这条路径。假设数据集 2 如下所示:
df2 <- data.frame(Patient = c(1,2,3,4,5),
Area1 = c("Arrival1", "Arrival1", "Arrival2", "Arrival1", "Arrival2"),
Area2 = c("Area A", "Diagnostics", "Area A", "Area B", NA),
Area3 = c("Area B", "Area A", "Area B", "Area A", NA),
Area4 = c("Ward", "Ward", "Ward", "Area C", NA),
Area5 = c(NA, NA, NA, NA, NA)
)
我想创建一个变量,为有效路径(例如患者 1)指示 TRUE,为无效路径(例如患者 4)指示 FALSE。我不知道该怎么做...
第 1 步:
df[,-1] <- data.frame(t(apply(df[,-1], 1, function(z) {
r <- rle(z)
c(r$values, rep(NA, length(z) - length(r$values)))
})))
df
# Patient Area1 Area2 Area3 Area4 Area5
# 1 1 Arrival1 Area A Area B Ward <NA>
# 2 2 Arrival1 Diagnostics Ward <NA> <NA>
# 3 3 Arrival2 Area A Area B Ward <NA>
# 4 4 Arrival1 Area B Area A Area C Arrival
# 5 5 Arrival2 <NA> <NA> <NA> <NA>
第 2 步:(待定,待定“可能的途径”)
对于具有患者路径(例如到达 -> Area A -> 病房)的数据集,我有一个两步数据清理问题。这是数据的示例:
df <- data.frame(Patient = c(1,2,3,4,5),
Area1 = c("Arrival1", "Arrival1", "Arrival2", "Arrival1", "Arrival2"),
Area2 = c("Area A", "Diagnostics", "Area A", "Area B", NA),
Area3 = c("Area B", "Diagnostics", "Area B", "Area A", NA),
Area4 = c("Ward", "Ward", "Area B", "Area C", NA),
Area5 = c(NA, NA, "Ward", "Arrival", NA)
)
第 1 步:删除连续列中的重复项 有些患者在连续的列中有重复项,例如对于患者 2(诊断 -> 诊断)和患者 3(区域 B -> 区域 B)。我需要这些是独特的途径。
我已经使用 apply()
和 rle()
解决了这个问题:
df1 <- apply(df,1,rle)
但是,这给了我一个包含值和长度的(大)列表。如何将其传输回上述形式的数据框(即保留患者 ID 和值)?我尝试了 do.call
、rbindlist()
和 unlist()
的各种版本,但其中 none 似乎对我有用。
第 2 步:检查路径逻辑 假设我们现在有一个干净的数据集:
dfclean <- data.frame(Patient = c(1,2,3,4,5),
Area1 = c("Arrival1", "Arrival1", "Arrival2", "Arrival1", "Arrival2"),
Area2 = c("Area A", "Diagnostics", "Area A", "Area B", NA),
Area3 = c("Area B", "Ward", "Area B", "Area A", NA),
Area4 = c("Ward", NA, "Ward", "Area C", NA),
Area5 = c(NA, NA, NA, "Arrival", NA)
)
现在我需要检查路径的逻辑。为此,我有第二个数据集,其中列出了所有可能的路径,我需要根据数据集 2 检查数据集 1 中的每个路径是否“可能”这条路径。假设数据集 2 如下所示:
df2 <- data.frame(Patient = c(1,2,3,4,5),
Area1 = c("Arrival1", "Arrival1", "Arrival2", "Arrival1", "Arrival2"),
Area2 = c("Area A", "Diagnostics", "Area A", "Area B", NA),
Area3 = c("Area B", "Area A", "Area B", "Area A", NA),
Area4 = c("Ward", "Ward", "Ward", "Area C", NA),
Area5 = c(NA, NA, NA, NA, NA)
)
我想创建一个变量,为有效路径(例如患者 1)指示 TRUE,为无效路径(例如患者 4)指示 FALSE。我不知道该怎么做...
第 1 步:
df[,-1] <- data.frame(t(apply(df[,-1], 1, function(z) {
r <- rle(z)
c(r$values, rep(NA, length(z) - length(r$values)))
})))
df
# Patient Area1 Area2 Area3 Area4 Area5
# 1 1 Arrival1 Area A Area B Ward <NA>
# 2 2 Arrival1 Diagnostics Ward <NA> <NA>
# 3 3 Arrival2 Area A Area B Ward <NA>
# 4 4 Arrival1 Area B Area A Area C Arrival
# 5 5 Arrival2 <NA> <NA> <NA> <NA>
第 2 步:(待定,待定“可能的途径”)