【发布时间】:2019-04-02 12:15:20
【问题描述】:
目前我正在处理显示一系列活动的数据,我想从这些序列中提取遵循特定模式的行。
一些示例序列:
set.seed(12345)
m <- matrix(sample(1:10, 800, replace=T), ncol=8)
m[sample(1:100, 20, replace=T), 8] <- NA #sequences have variable lengths
head(m)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 4 2 3 1 1 2 4 4
[2,] 5 4 5 3 3 4 1 2
[3,] 4 5 1 4 2 5 3 3
[4,] 5 4 3 4 2 5 4 NA
[5,] 3 3 4 3 3 4 2 1
[6,] 1 5 4 4 1 5 5 4
一种解决方案是使用两个 for 循环来检查每一行是否存在可能的模式,但是我体验过当矩阵变大时计算时间会快速增长。我已经尝试了下面的示例代码以获取大小为 3 的模式,其中活动 1 后跟活动 2 和活动 3:
pattern <- list(1,2,3)
g <- list()
for (i in 1:NROW(m)){
if (any(m[i,]==pattern[1], na.rm = TRUE) & any(m[i,]==pattern[2], na.rm = TRUE) & any(m[i,]==pattern[3], na.rm = TRUE)){
for(ii in 1:(NCOL(m)-2)){
if((m[i,ii]==pattern[1]) & (m[i,ii+1]==pattern[2]) & (m[i,ii+2]==pattern[3])){
g <- append(g,i)
}
}
}
}
这个循环似乎有效,因为它提供了一个列表,其中包含与模式匹配的行的索引(第 28、32 和 99 行)。然而,这种方法对于更长/更短的模式是不可扩展的。此外,在此示例中,检查了“1 -> 2 -> 3”模式,但我也希望可以检查“1 -> (2, 4 or 5) -> 3”等模式。
我希望编写一个类似于this question 中接受的答案的函数,其中输入需要一个矩阵和一个显示为列表的模式。但是我的 R 知识有限,我可以使用一些帮助。
【问题讨论】:
-
grepl( 15.8 , mtcars$mpg)
-
您在示例中匹配的模式是什么?
-
经典正则表达式或
grepl用例 - 检查帮助 - 可能是一个帮助列,您可以在其中将值连接(即paste)到单个列中,这也会使 grepping 更容易
标签: r