как найти общее количество последовательных цифр в последовательности чисел - PullRequest
3 голосов
/ 22 марта 2020

У меня есть список чисел [2554, 201, 452, 3111, 4133, 2210, 1235, 430, 4210, 11, 513, 1305, 2550, 5312, 512, 3535, 1014, 4013, 234, 4112, 13, 2433, 5233, 4500]. Я пытаюсь выяснить, многие ли из этих чисел содержат последовательные цифры. Например, 2554 имеет последовательные цифры (5), а 513 и 3535 - нет. Я знаю, что общее количество чисел с последовательными цифрами равно 10 из 24.

#my code
count = 0
z = c(2554, 201, 452, 3111, 4133, 2210, 1235, 430, 4210, 11, 513, 1305, 2550, 5312, 512, 3535, 1014, 4013, 234, 4112, 13, 2433, 5233, 4500)
for(i in 1:24){
  if((grep(pattern = "\\d{2}", x = z[i])) == 1){
    count = count + 1
  }
}

Я пытаюсь использовать grep, но он не работает, я что-то не так делаю?

Ответы [ 3 ]

5 голосов
/ 22 марта 2020

Вам не нужно for l oop в grep / grepl, поскольку они векторизованы.

Чтобы найти последовательные цифры, вы можете использовать обратную ссылку первой ди git группы захвата в grepl.

sum(grepl('(\\d)\\1', z))
#[1] 10

Или аналогично grep

length(grep('(\\d)\\1', z))

Чтобы узнать, какие числа имеют последовательные цифры, вы можете использовать value = TRUE в grep.

grep('(\\d)\\1', z, value = TRUE)
#[1] "2554" "3111" "4133" "2210" "11"   "2550" "4112" "2433" "5233" "4500"
1 голос
/ 22 марта 2020

Мы можем использовать str_detect

library(stringr)
sum(str_detect(z, '(\\d)\\1'))
#[1] 10
0 голосов
/ 22 марта 2020

Вы можете использовать 'rle', чтобы найти 'серии' символов

library(tidyverse)
z = c(2554, 201, 452, 3111, 4133, 2210, 
      1235, 430, 4210, 11, 513, 1305, 
      2550, 5312, 512, 3535, 1014, 
      4013, 234, 4112, 13, 2433, 5233, 4500)

# split out to separate character each digit and then use 'rle' to
# look for 'runs' of the characters
as_char <- map_dfr(z, ~{
  str <- strsplit(as.character(.x), '')[[1]]
  rle_str <- rle(str)
  # find which have runs > 1
  indx <- which(rle_str$lengths > 1)
  tibble(input = .x, count = rle_str$lengths[indx], value = rle_str$values[indx])
})
as_char

> as_char
# A tibble: 10 x 3
input count value
<dbl> <int> <chr>
  1  2554     2 5    
2  3111     3 1    
3  4133     2 3    
4  2210     2 2    
5    11     2 1    
6  2550     2 5    
7  4112     2 1    
8  2433     2 3    
9  5233     2 3    
10  4500     2 0    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...