我在这里相当新,而且对于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
我似乎找不到一个方法/函数来输出我想要的东西(简单计算出现次数)。
如果有人能提供任何见解/帮助,我们将不胜感激。
答案 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位开始。