识别、提取和计数序列中的模式
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))
你好可爱又善良的 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))