R:计算数字模式的数量

时间:2017-03-22 20:10:07

标签: r string pattern-matching

我在这里相当新,而且对于R来说也是相当新的,如果有什么不清楚的话,请道歉。

基本上,每个人都有一张csv数字表,每周有一个数字,为​​期38周。

例如,安东尼在第1周排名第6,第2周排名第12,依此类推,这些数字相当随机,范围从1-20。

我从表中取出数字并将它们保存为一个字符串,因此印刷后的Anthonys字符串看起来像

  

" 6 12 18 7 17 4 16 11 20 15 3 5 19 10 8 9 1 14 13 19 11 16 18 4 17 7 6 12 14 1 10 13 20 15 3 5 8 9"

我尝试做的是查找/计算1到10之间的数字连续3组,然后连续4组,可能是5组的次数。

例如,在此字符串中,连续出现8,9和1,然后连续出现3,5,8和9,这意味着出现的数量为2.

我尝试过使用stringr包中的str_count,并尝试了一些不同的函数 - Count the number of overlapping substrings within a string

我似乎找不到一个方法/函数来输出我想要的东西(简单计算出现次数)。

如果有人能提供任何见解/帮助,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

将这些作为数字保存会更容易。在这里,我使用scan()将您的字符串转换为值的向量,指示每个数字是否小于10,然后我在其上调用rle()来计算运行长度

x <- "6 12 18 7 17 4 16 11 20 15 3 5 19 10 8 9 1 14 13 19 11 16 18 4 17 7 6 12 14 1 10 13 20 15 3 5 8 9"
rr <- rle(scan(text=x)<10)

现在我可以将它变成一个data.frame并查看哪些运行时间长于2

subset(as.data.frame(unclass(rr)), values==T & lengths>2)
#    lengths values
# 9        3   TRUE
# 17       4   TRUE

所以我们可以看到我们有3次运行和4次运行。

我可以通过定义一个函数来清理它,以便更轻松地将rle转换为data.frame并跟踪起始索引

as.data.frame.rle <- function(x) {
    data.frame(unclass(x), start=head(cumsum(c(0,rr$lengths))+1,-1))
}

然后可以运行

subset(as.data.frame(rle(scan(text=x)<10)), values==T & lengths>2)
#    lengths values start
# 9        3   TRUE    15
# 17       4   TRUE    35

所以我们可以看到这些运行从第15和第35位开始。