计算向量中序列的连续出现次数

时间:2016-02-09 19:57:14

标签: r

给定一个通用向量x(可以是数字,字符,因子等),我需要能够计算value的连续出现次数,包括单例。

x <- c(0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1)

在这种情况下,如果value == 0,则会返回以下内容。

[1] 1 1 2 3

以下代码可行,但x变大时速度非常慢。有谁知道加速这个的方法?我想必须有一种聪明的矢量化方法。

getSequential <- function(x, value) {

  counts <- c()
  last <- FALSE

  for (i in 1:length(x)) {

    if (last & x[i] == value) {
      counts[length(counts)] <- counts[length(counts)] + 1
    } else if (x[i] == value) {
      counts <- c(counts, 1)
      last <- TRUE
    } else {
      last <- FALSE
    }

  }

  return(counts)

}

2 个答案:

答案 0 :(得分:2)

您可以使用rle

rle(x)$lengths[which(rle(x)$values==0)]

# 1 1 2 3

对于速度,您只能运行rle一次:

x1 <- rle(x)
x1$lengths[which(x1$values==0)]

答案 1 :(得分:0)

嗯,代码非常好。我怀疑使用rlewithwhich会一起提高算法的速度(很多)。

我的主张:

counting(int[] input, int value) {
    int[] len = int[size(input)](); \\assume worst case scenario
    len[0] = 0;
    int j = 0;
    for (i = 0; i < size(input); i++) { \\2 unit operations
        if (input[i] != value && len[j] == 0) \\followed relatively often, 3-4 unit operations (1-2 unit operations on this step)
            continue; \\5 unit operations
        else if (input[1] == value) \\also followed relatively often, 4 unit operations (on '&&' if first is false, second is not checked)
            len[j]++; \\5 unit operations
        else /*if (input[i] != value && len[j] != 0)*/ { \\4 unit operations (commented operation is not needed (only remaining possible outcome)
            j++; \\5 unit operations
            len[j] = 0; \\7 unit operations (access and substitution)
            continue; \\8 unit operations
        }
    }
}

正如您所看到的,最多有8个单元操作,最多4-5个。最糟糕的情况是有8个操作有n / 2个路径,但大多数情况下我认为它会遵循5步路径之一。

好吧,也许rle和其他功能都得到了更好的优化,但问题是,它是否针对您的问题进行了优化?我建议检查。