给定一个通用向量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)
}
答案 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)
嗯,代码非常好。我怀疑使用rle
和with
或which
会一起提高算法的速度(很多)。
我的主张:
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
和其他功能都得到了更好的优化,但问题是,它是否针对您的问题进行了优化?我建议检查。