Длина самых длинных последовательных цифр в R - PullRequest
0 голосов
/ 27 февраля 2019

Я хочу найти длину самых длинных последовательных цифр.Я написал следующий код, но он не дает правильного вывода для нескольких случаев.

    x <- c("1234589","8205","0126789","016","7894", "987645")
lapply(x, function(x)max(rle(cumsum(c(1, diff(as.numeric(strsplit(as.character(x), "")[[1]])) > 1)))$lengths))

Мои выводы:

[[1]]
[1] 5

[[2]]
[1] 3

[[3]]
[1] 4

[[4]]
[1] 2

[[5]]
[1] 4

[[6]]
[1] 6

Где правильный вывод должен быть:

[[1]]
[1] 5

[[2]]
[1] 1

[[3]]
[1] 4

[[4]]
[1] 2

[[5]]
[1] 3

[[6]]
[1] 4

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019
lapply(strsplit(x, ""), function(x)
    with(rle(diff(as.numeric(x)) %in% c(1, -1)),{
        temp = lengths[values]
        1+max(0, temp[which.max(temp)])
    }))
#[[1]]
#[1] 5

#[[2]]
#[1] 1

#[[3]]
#[1] 4

#[[4]]
#[1] 2

#[[5]]
#[1] 3

#[[6]]
#[1] 4
0 голосов
/ 27 февраля 2019

Другой вариант:

lapply(x, function(x) {
  right <- max(rle(abs(c(1, diff(as.numeric(strsplit(as.character(x), "")[[1]])))))$lengths)
  left <- max(rle(abs(c(1, rev(diff(as.numeric(strsplit(as.character(x), "")[[1]]))))))$lengths)
  return(pmax(right, left))
  })

Вывод:

[[1]]
[1] 5

[[2]]
[1] 1

[[3]]
[1] 4

[[4]]
[1] 2

[[5]]
[1] 3

[[6]]
[1] 4
0 голосов
/ 27 февраля 2019

Это возможно без использования rle

lapply(x, function(s) {
    v <- as.numeric(unlist(strsplit(s, "")))
    max(sapply(split(v, cumsum(c(0, abs(diff(v)) != 1))), length))
})
#[[1]]
#[1] 5
#
#[[2]]
#[1] 1
#
#[[3]]
#[1] 4
#
#[[4]]
#[1] 2
#
#[[5]]
#[1] 3
#
#[[6]]
#[1] 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...