使用 RLE 删除每行的连续重复项并检查 R 中的序列逻辑

Posted

技术标签:

【中文标题】使用 RLE 删除每行的连续重复项并检查 R 中的序列逻辑【英文标题】:Remove consecutive duplicates per row with RLE and check logic of sequence in R 【发布时间】:2022-01-13 14:42:06 【问题描述】:

对于具有患者路径(例如到达 -> 区域 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 &lt;- apply(df,1,rle)

但是,这给了我一个(大)列表,其中包含值和长度。如何将其传输回上述表格的数据框(即保留患者 ID 和值)?我尝试了各种版本的do.callrbindlist()unlist(),但它们似乎都不适合我。

第 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。我不知道该怎么做...

【问题讨论】:

可能路径的“第二个数据集”在哪里? 在上面。 “假设数据集 2 看起来像这样:” 你是说每个病人都有不同的可能途径? 【参考方案1】:

第 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 步:(待定,待定“可能的途径”)

【讨论】:

以上是关于使用 RLE 删除每行的连续重复项并检查 R 中的序列逻辑的主要内容,如果未能解决你的问题,请参考以下文章

根据一列删除重复项并根据另一表中的数据进行过滤

删除“case when”中的重复项并计算步骤之间的平均值

正则表达式提取、删除重复项并与 Google 表格中的管道连接

如何删除已经在list中的重复项

6.3RLE算法的缺点

循环没有捕获重复项并在 Android(Java) 中删除它们