识别、提取和计数序列中的模式

Identifying, extracting and counting patterns in sequences

你好可爱又善良的 SO 人,我正在处理一个只包含两列的数据框,一列对应于虚拟机生成的唯一 ID,第二列包含一个名称,但这一列特别也可能包含字符串“ERROR”,objective 用于创建一个脚本,允许我们在每次找到字符串“ERROR”时进行识别,并捕获它周围的最后一个和后面的名称以及分配的唯一 ID到字符串“ERROR”,为了说明让我们看下面的例子:

如果我有这个数据

ID NAMES
1 James
3 ERROR
6 Keras
88 Kelly
53 Micheal
55 ERROR
7 Cindy
834 Keras

那么我们想得出以下列表:

ID NAMES
3 James-Keras
55 Micheal-Cindy

这是因为找到的第一个字符串“ERROR”的 ID 为 3,并且位于名称 James(在 ERROR 之前)和 Keras(在 ERROR 之后)之间,下一个“ERROR”的 ID 为 55,并且在 Micheal 之间和 Cindy 如果“ERROR”是列表的顶部或底部怎么办 那么我们应该只包含我们认为可以让我们说“NA-NAME”是 ERROR 的任何名称在顶部找到...

但是,如果我们 运行 进入一个包含连续字符串“ERROR”的序列,我们应该始终使用降序排列的最后一个字符串作为“指南”,例如:

如果我有这个数据集

ID NAMES
1 James
3 ERROR
6 ERROR
88 ERROR
53 Jude
55 ERROR
7 Cindy
834 Keras

那我们就想要

ID NAMES
88 James-Jude
55 Jude-Cindy

这是因为字符串 ERROR 连续重复了 3 次,但最后一次在 ID 88 处,所以这意味着我们将其作为参考并记录其前后的名称,另一种查看方式这是将字符串“ERROR”视为一个块,因此我们将记录每个字符串块“ERROR”

前后的名称

非常感谢所有试图帮助我的人,如果您能参考一本书或可以帮助我的函数,我将不胜感激。非常感谢。

我们可以创建一个函数来执行此操作

f1 <- function(dat) {

    subdat1 <- subset(dat, !duplicated(with(rle(NAMES == "ERROR"), 
           rep(seq_along(values), lengths)), fromLast = TRUE))
    subdat2 <- subset(dat, !duplicated(with(rle(NAMES == "ERROR"), 
          rep(seq_along(values), lengths))))
    ind <- which(subdat1$NAMES == "ERROR")
    do.call(rbind, lapply(ind[c(TRUE, diff(ind) > 1)], function(i) 
        data.frame(ID = subdat1$ID[i],NAMES = paste(subdat1$NAMES[i-1], 
        subdat2$NAMES[i+1], sep="-"))))
}

-测试

> f1(df1)
  ID         NAMES
1  3   James-Keras
2 55 Micheal-Cindy
> f1(df2)
  ID      NAMES
1 88 James-Jude
2 55 Jude-Cindy

数据

df1 <- structure(list(ID = c(1L, 3L, 6L, 88L, 53L, 55L, 7L, 834L), NAMES = c("James", 
"ERROR", "Keras", "Kelly", "Micheal", "ERROR", "Cindy", "Keras"
)), class = "data.frame", row.names = c(NA, -8L))

df2 <- structure(list(ID = c(1L, 3L, 6L, 88L, 53L, 55L, 7L, 834L), NAMES = c("James", 
"ERROR", "ERROR", "ERROR", "Jude", "ERROR", "Cindy", "Keras")), 
 class = "data.frame", row.names = c(NA, 
-8L))