Альтернативы гораздо быстрее путем без использования rle
бы разделить с последовательным 0 'следующим образом:
# following thelatemail's comment, changed '0+' to '[^1]+'
strsplit(x, "[^1]+", perl=TRUE)
Затем вы можете запрограммировать и получить максимальные символы для каждого элемента вашего списка. Это будет быстрее, чем rle
решение. и также быстрее, чем решение gregexpr
от @Joshua. Некоторые бенчмаркинг ...
zz <- function(x) {
vapply(strsplit(x, "[^1]+", perl=TRUE), function(x) max(nchar(x)), 0L)
}
Я просто понял, что @ функции Джошуа также может быть изменен путем добавления perl=TRUE
и использования vapply
. Итак, я сравню это.
g2 <- function(S) vapply(gregexpr("1*",S, perl=TRUE),
function(x) max(attr(x,'match.length')), 0L)
require(microbenchmark)
microbenchmark(t1 <- zz(unname(s)), t2 <- g(unname(s)), t3 <- g2(unname(s)), times=50)
Unit: seconds
expr min lq median uq max neval
t1 <- zz(unname(s)) 1.187197 1.285065 1.344371 1.497564 1.565481 50
t2 <- g(unname(s)) 2.154038 2.307953 2.357789 2.417259 2.596787 50
t3 <- g2(unname(s)) 1.562661 1.854143 1.914597 1.954795 2.203543 50
identical(t1, t2) # [1] TRUE
identical(t1, t3) # [1] TRUE
Что вы пробовали (и другие вопросы из [переполнения стеки вопросов контрольного списка] (http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist))? –
Я только пробовал использовать циклы. У меня есть две петли в качестве счетчика числа строк, который начинается с первой строки набора данных и доходит до конца. Другой цикл как счетчик числа последовательных 1. Но это очень неэффективно и занимает много времени. – Sam
@ Томас, вы правы. Я искал, но ничего не нашел. Я должен был использовать лучшие ключевые слова для поиска. – Sam