2012-07-17 10 views
9

Ich arbeite an einem Projekt, wo ich eine Anzahl von "T score" -Tabellen in R eingeben muss. Diese Tabellen werden verwendet, um rohe Testergebnisse in standardisierte Werte umzuwandeln. Sie folgen im Allgemeinen einem bestimmten Muster, aber nicht einem, das einfach ist. Zum Beispiel, ein Muster ist:Erzeugen numerischer Sequenzen in R unter Verwendung von Standardmustern

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 

ich lieber eine einfache Funktion zu verwenden, diese zu füllen, anstatt sie von Hand eingeben. Ich weiß, dass die f() Funktion eine einfache seqeuence erstellen kann, wie:

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

Gibt es eine Möglichkeit komplexere Abläufe anhand von spezifischen Mustern zu schaffen? Zum Beispiel könnten die obigen Daten wie folgt ausgeführt werden:

... dies führt jedoch zu einem Fehler. Ich dachte, es würde eine Funktion geben, die das tun sollte, aber all mein Google-Fu hat mich gerade zum ursprünglichen seq() gebracht.

+0

Danke für all die großen Antworten. Cumsum() sieht aus wie es die beste Wahl ist! – TARehman

Antwort

10

dies geschehen könnte die cumsum (kumulative Summe) Funktion und rep mit:

> 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 

Um sicherzustellen, dass die Sequenz an der richtigen Stelle hält:

> (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

Hier ist eine benutzerdefinierte Funktion das sollte in den meisten Fällen funktionieren. Es verwendet die kumulative Summe (cumsum()) einer Sequenz und eine ganzzahlige Division, um die Länge der gewünschten Sequenz zu berechnen.

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

Probieren Sie es aus:

> 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

Hier ist eine nicht-iterative Lösung ist, den Fall, dass Sie ein bestimmtes Element der Sequenz

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