2017-01-25 36 views
5

Chcę użyć R, aby utworzyć ciąg liczb 1: 8, 11:18, 21:28, itp. Do 1000 (lub najbliżej, jakie może uzyskać, tj. 998). Oczywiście pisanie tego wszystkiego byłoby męczące, ale ponieważ sekwencja wzrasta o 7 razy, a następnie przeskakuje o 3, nie jestem pewien, jaką funkcję mógłbym użyć, aby to osiągnąć.Generowanie sekwencji z naprzemiennymi przyrostami w R?

Próbowałem seq(1, 998, c(1,1,1,1,1,1,1,3)), ale nie daje mi to wyników, których szukam, więc muszę zrobić coś złego.

Odpowiedz

6

Jest to idealny przypadek wektoryzację (recykling zbyt) w R. przeczytać o nich

(1:100)[rep(c(TRUE,FALSE), c(8,2))] 
# [1] 1 2 3 4 5 6 7 8 11 12 13 14 15 16 17 18 21 22 23 24 25 26 27 28 31 32 
#[27] 33 34 35 36 37 38 41 42 43 44 45 46 47 48 51 52 53 54 55 56 57 58 61 62 63 64 
#[53] 65 66 67 68 71 72 73 74 75 76 77 78 81 82 83 84 85 86 87 88 91 92 93 94 95 96 
#[79] 97 98 
+8

@akrun - Twoje pierwsze rozwiązanie wydaje się być kopią tego jednego? (nie mój głos, btw) – SymbolixAU

+0

@SymbolixAU tylko pytam, dlaczego wszystkie posty dostały awans? –

+1

Nie mam pojęcia, nie głosowałem na nikogo – SymbolixAU

5
rep(seq(0,990,by=10), each=8) + seq(1,8) 
-1

Z cyklu: for(value in c(seq(1,991,10))){vector <- c(vector,seq(value,value+7))}

3

chcesz wykluczyć numery, które są 0 or 9 (mod 10). Więc można spróbować też:

n <- 1000 # upper bound 
x <- 1:n 
x <- x[! (x %% 10) %in% c(0,9)] # filter out (0, 9) mod (10) 

head(x,80) 
# [1] 1 2 3 4 5 6 7 8 11 12 13 14 15 16 17 18 21 22 23 24 25 26 27 
# 28 31 32 33 34 35 36 37 38 41 42 43 44 45 46 47 48 51 52 53 54 55 56 57 
# 58 61 62 63 64 65 66 67 68 71 72 73 74 75 76 77 78 81 82 83 84 85 
# 86 87 88 91 92 93 94 95 96 97 98 

Albo w jednej linii z wykorzystaniem Filter:

Filter(function(x) !((x %% 10) %in% c(0,9)), 1:100) 
# [1] 1 2 3 4 5 6 7 8 11 12 13 14 15 16 17 18 21 22 23 24 25 26 27 28 31 32 33 34 35 36 37 38 41 42 43 44 45 46 47 48 51 52 53 54 55 56 57 
# [48] 58 61 62 63 64 65 66 67 68 71 72 73 74 75 76 77 78 81 82 83 84 85 86 87 88 91 92 93 94 95 96 97 98