Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算R中序列的重复部分?_R_Count_Sequence_Repeat - Fatal编程技术网

如何计算R中序列的重复部分?

如何计算R中序列的重复部分?,r,count,sequence,repeat,R,Count,Sequence,Repeat,可以在R中计算序列的重复部分吗? 例如: x<- c(1,3.0,3.1,3.2,1,1,2,3.0,3.1,3.2,4,4,5,6,5,3.0,3.1,3.2, 3.1,2,1,4,6,4.0,4,3.0,3.1,3.2,5,3.2,3.0,4) x您可以将其转换为字符串,并使用gregexpr sum(gregexpr("3 3.1 3.2", paste(x, collapse=" "), fixed=TRUE)[[1]] != -1) [1] 4 我会这样做: p

可以在R中计算序列的重复部分吗? 例如:

x<- c(1,3.0,3.1,3.2,1,1,2,3.0,3.1,3.2,4,4,5,6,5,3.0,3.1,3.2,
      3.1,2,1,4,6,4.0,4,3.0,3.1,3.2,5,3.2,3.0,4)

x您可以将其转换为字符串,并使用
gregexpr

sum(gregexpr("3 3.1 3.2", paste(x, collapse=" "), fixed=TRUE)[[1]] != -1)
[1]  4

我会这样做:

pattern <- c(3, 3.1, 3.2)
len1 <- seq_len(length(x) - length(pattern) + 1)
len2 <- seq_len(length(pattern))-1
sum(colSums(matrix(x[outer(len1, len2, '+')], 
     ncol=length(len1), byrow=TRUE) == pattern) == length(len2))
seqle <- function(x,incr=1) { 
    if(!is.numeric(x)) x <- as.numeric(x) 
    n <- length(x)  
    y <- x[-1L] != x[-n] + incr 
    i <- c(which(y|is.na(y)),n) 
    list(lengths = diff(c(0L,i)),
         values = x[head(c(0L,i)+1L,-1L)]) 
}
temp <- seqle(x, incr=.1)
temp
# $lengths
#  [1] 1 3 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1
# 
# $values
#  [1] 1.0 3.0 1.0 1.0 2.0 3.0 4.0 4.0 5.0 6.0 5.0 3.0 3.1 2.0 1.0 4.0
# [17] 6.0 4.0 4.0 3.0 5.0 3.2 3.0 4.0
卡尔·维特霍夫的《模式》在这里可能对你有用

函数如下所示:

pattern <- c(3, 3.1, 3.2)
len1 <- seq_len(length(x) - length(pattern) + 1)
len2 <- seq_len(length(pattern))-1
sum(colSums(matrix(x[outer(len1, len2, '+')], 
     ncol=length(len1), byrow=TRUE) == pattern) == length(len2))
seqle <- function(x,incr=1) { 
    if(!is.numeric(x)) x <- as.numeric(x) 
    n <- length(x)  
    y <- x[-1L] != x[-n] + incr 
    i <- c(which(y|is.na(y)),n) 
    list(lengths = diff(c(0L,i)),
         values = x[head(c(0L,i)+1L,-1L)]) 
}
temp <- seqle(x, incr=.1)
temp
# $lengths
#  [1] 1 3 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1
# 
# $values
#  [1] 1.0 3.0 1.0 1.0 2.0 3.0 4.0 4.0 5.0 6.0 5.0 3.0 3.1 2.0 1.0 4.0
# [17] 6.0 4.0 4.0 3.0 5.0 3.2 3.0 4.0
在本例中,所有序列的长度都是相同的,并且它们从相同的值开始,因此我们只需查看上面生成的
data.frame
中的行数即可得到答案。

还有一种(通用移动窗口)方法:

x <- c(1,3.0,3.1,3.2,1,1,2,3.0,3.1,3.2,4,4,5,6,5,3.0,3.1,3.2, 3.1,2,1,4,6,4.0,4,3.0,3.1,3.2,5,3.2,3.0,4)
s <- c(3, 3.1, 3.2)

sum(apply(embed(x, length(s)), 1, function(y) {all(y == rev(s))}))
# [1] 4

你只想数一数那个特定的子序列吗?或者是否要标识数据中可能存在的任何其他子序列?请插入有关匹配浮点值的标准警告。除非您需要将所有内容都保留为数字,否则您可能希望通过
sprintf(“%2f”,mydata)
或等效程序运行数据,以便对字符串进行精确匹配。如果不匹配,则会给出1的答案,因为
gregexpr
在不匹配的情况下返回-1。这会对重叠序列给出错误的结果:
x=c(1,2,2,2,3,2,2);s=c(2,2)
@eddi说“不正确”有点傻当你真的不知道OP想要对重叠序列做什么,或者实际上,如果需要考虑重叠序列。@HongOoi我认为你应该尝试修复而不是防御,这比其他解决方案对重叠序列做的更多,至少应该给你一个答案pause@HongOoi FWIW如果您想捕获重叠的模式,您可以将该模式包装在一个前瞻断言中,并设置
fixed=FALSE,perl=TRUE
+1,尽管我不确定这是否是OP想要的。例如:该模式也可以是:
c(10,8,15)
@Arun,没错。只是把它扔出去!我不得不回避给它+1,原因很明显:-)。但我很荣幸你能引用我的衍生作品。@CarlWitthoft,你太谦虚了:)。该功能非常有用!去吧,给它一个+1:)@CarlWitthoft,我在这里已经不止一次这样做了!你打算什么时候打包这个东西?我一开始也遇到了
embed
。但是向量扫描需要转置。或者应该使用
apply
。因此,我恢复了按行构造矩阵的方法。有意义的是,我刚刚进行了测试,这比你的
外部
方法稍微快一点,当你摆脱
应用
并做你的
矩阵
事情时;我也将在中编辑该方法