9

いくつかの「Tスコア」テーブルをRに入力する必要があるプロジェクトに取り組んでいます。これらは、生のテストスコアを標準化された値に変換するために使用されるテーブルです。それらは一般的に特定のパターンに従いますが、単純なパターンではありません。たとえば、1つのパターンは次のとおりです。

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

手で入力するのではなく、単純な関数を使用してこれらを入力したいと思います。seq()関数は、次のような単純なシーケンスを作成できることを知っています。

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

特定のパターンに基づいてより複雑なシーケンスを作成する方法はありますか?たとえば、上記のデータは次のように実行できます。

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

...ただし、これによりエラーが発生します。これを行うべき関数があると思いましたが、私のGoogle-fuはすべて、元のseq()に戻ったばかりです。

4

3 に答える 3

10

cumsumこれは、 (累積合計)関数と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

シーケンスが正しい場所で停止することを確認するには:

> (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
于 2012-07-17T22:01:23.640 に答える
9

これは、ほとんどの場合に機能するカスタム関数です。シーケンスの累積合計(cumsum())と整数除算を使用して、目的のシーケンスの長さを計算します。

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

それを試してみてください:

> 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
于 2012-07-17T22:07:50.200 に答える
3

シーケンスの特定の要素が必要な場合に備えて、これは非反復的なソリューションです。

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
于 2012-07-17T23:00:52.023 に答える