2012-07-17 15 views
9

Pracuję nad projektem, w którym muszę wprowadzić kilka tabel "T score" do R. Są to tabele używane do konwersji surowych wyników testów na wartości standaryzowane. Zwykle podążają za określonym wzorcem, ale nie takim, który jest prosty. Na przykład, jeden wzór jest:Tworzenie sekwencji numerycznych w R przy użyciu wzorców standardowych

34,36,39,42,44,47,50,52,55,58,60,63,66,68, 
71,74,76,79,82,84,87,90,92,95,98,100,103,106 

wolałbym używać prostych funkcji, aby wypełnić je w, zamiast wpisywać je ręcznie. Wiem, że funkcja seq() może stworzyć prosty seqeuence, jak:

R> seq(1,10,2) 
[1] 1 3 5 7 9 

Czy istnieje jakiś sposób, aby stworzyć bardziej skomplikowane sekwencje oparte na konkretnych wzorców? Na przykład powyższe dane można wykonać jako:

c(34,seq(36:106,c(3,3,2)) # The pattern goes 36,39,42,44,47,50,52 (+3,+3,+2) 

... jednak powoduje to błąd. Myślałem, że będzie funkcja, która powinna to zrobić, ale wszystkie moje Google-fu właśnie doprowadziły mnie do pierwotnego seq().

+0

Dzięki dla wszystkich wielkich odpowiedzi. cumsum() wygląda na to, że będzie to najlepszy wybór! – TARehman

Odpowiedz

10

Można to zrobić za pomocą funkcji cumsum (skumulowana suma) i rep:

> 31 + cumsum(rep(c(3, 2, 3), 9)) 
[1] 34 36 39 42 44 47 50 52 55 58 60 63 66 68 71 74 76 79 82 
[20] 84 87 90 92 95 98 100 103 

, aby upewnić się, że sekwencja zatrzymuje się na właściwym miejscu:

> (31 + cumsum(rep(c(3, 2, 3), 10)))[1:28] 
[1] 34 36 39 42 44 47 50 52 55 58 60 63 66 68 71 74 76 79 82 
[20] 84 87 90 92 95 98 100 103 106 
9

Oto funkcja zwyczaj to powinno działać w większości przypadków. Wykorzystuje on skumulowaną sumę (cumsum()) sekwencji i podział całkowity w celu obliczenia długości żądanej sekwencji.

cseq <- function(from, to, by){ 
    times <- (to-from) %/% sum(by) 
    x <- cumsum(c(from, rep(by, times+1))) 
    x[x<=to] 
} 

Spróbuj:

> cseq(36, 106, c(3,3,2)) 
[1] 36 39 42 44 47 50 52 55 58 60 63 66 68 71 74 76 79 82 84 87 90 92 95 98 
[25] 100 103 106 

> cseq(36, 109, c(3,3,2)) 
[1] 36 39 42 44 47 50 52 55 58 60 63 66 68 71 74 76 79 82 84 87 90 92 95 98 
[25] 100 103 106 108 
3

Oto non-iteracyjny rozwiązanie, w przypadku potrzeby konkretnego elementu sekwencji

f <- function(x){ 
d <- (x) %/% 3 
r <- x %% 3 
31 + d*8 + c(0,3,5)[r+1] 
} 

> f(1:10) 
[1] 34 36 39 42 44 47 50 52 55 58 
Powiązane problemy