2017-01-10 11 views
4

おそらくlapply()や他の外挿する手続きを使って、Rで以下のようなリストを生成するスマートな方法はありますか?Rでリストを生成し、エントリ番号に関連するパターン

ones = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) 
twos = c(1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1) 
threes = c(1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0) 
fours = c(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0) 
fives = c(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1) 
l = list(ones, twos, threes, fours) 

[[1]] 
[1] 1 1 1 1 1 1 1 1 1 1 1 

[[2]] 
[1] 1 0 1 0 1 0 1 0 1 0 1 

[[3]] 
[1] 1 0 0 1 0 0 1 0 0 1 0 

[[4]] 
[1] 1 0 0 0 1 0 0 0 1 0 0 

これらは、パーティションの関数を生成する際の多項式の係数に対応します。

最初のリストはonesであるため、カウントは一度に1ステップ単位で行われます。したがってベクトル1,1,1,1,1,1,1,...[[2]]のエントリにはtwosがあり、00とコード化されています)をスキップして0で始まる2でカウントしています。 [[3]]に、我々は3年代によってカウントされた:基地Rでゼロ、3、6、9、等

答えて

7

Aかなり簡単な方法は、

lapply(seq(0L, 5L), function(i) rep(c(1L, integer(i)), length.out=11L)) 
[[1]] 
[1] 1 1 1 1 1 1 1 1 1 1 1 

[[2]] 
[1] 1 0 1 0 1 0 1 0 1 0 1 

[[3]] 
[1] 1 0 0 1 0 0 1 0 0 1 0 

[[4]] 
[1] 1 0 0 0 1 0 0 0 1 0 0 

[[5]] 
[1] 1 0 0 0 0 1 0 0 0 0 1 
  • seq(0L, 5L) 5を通してベクトル0を発生します等価はseq_len(5L)-1Lとなり、大きなベクトルの作成にはより高速です。
  • c(1L, integer(i))は、0-1ベクトルの内側の反復部分を生成します。repは、length.out引数を使用して、希望する長さ(ここでは11)に従って繰り返します。
  • lapplyおよびfunction(i)は、ベクトルをループするにつれて0の数を増やすことができます。
関連する問題