0

Rで出力をベクトルとして取得するにはどうすればよいですか?

たとえば、私がしたい場合

for (i in 1:1000) {if i mod 123345 = 0, a = list(i)}
a

iしかし、最大のものだけでなく、123345 (つまり、因数) に均等に分割されるすべてのものを見つけたいと思います。

4

3 に答える 3

9

これを行うにはもっと簡潔な方法があるかもしれませんが、私はこのようにします:

i <- 1:1000
j <- i[12345 %% i == 0 ]

結果のベクトルjには、12345 の因数である i の値のベクトルが含まれます。R では、モジュロ演算子は %% であり、自分で検索するときに見つけるのは少し難しいです。+これは算術演算子のヘルプ ドキュメントに埋もれており、次のように引用符で囲む必要があるものを検索することで見つけることができます?"+"

VBA の回答を見つけたい場合は、VBA タグを追加することをお勧めします。しかし、VBAモジュロ演算子が関係していると思います;)

于 2010-09-15T20:21:59.020 に答える
2

JD Long の方法が最初に思い浮かびましたが、別の方法です。

Filter(function(x) !(12345 %% x), 1:1000)

明示的な割り当ての必要性を避けるのは、ちょっと楽しいと思います。(毎回新しい関数を作成するのはちょっと残念です。) (この場合、「!」はゼロ以外の値を FALSE に、ゼロを TRUE に変換します。「フィルター」は、TRUE と評価される各要素を選択します。)

また、別の割り当ての必要性を回避し、新しい関数を作成しない:

which(!(12345 %% 1:1000))

タイミング:

> y <- 1:1000
> system.time(replicate(1e5, y[12345 %% y == 0 ]))
   user  system elapsed 
  8.486   0.058   8.589
> system.time(replicate(1e5, Filter(function(x) !(12345 %% x), y)))

Timing stopped at: 90.691 0.798 96.118  # I got impatient and killed it
# Even pulling the definition of the predicate outside,
# it's still too slow for me want to wait for it to finish.
# I'm surprised Filter is so slow.
> system.time(replicate(1e5, which(!12345 %% y)))
   user  system elapsed 
 11.618   0.095  11.792

したがって、JD Long の方法が勝者のようです。

于 2010-09-16T06:57:05.280 に答える
0

あなたが書いた:

for (i in 1:1000) {if i mod 123345 = 0, a = list(i)} a

JD Long のコードははるかに優れていますが、この愚かな戦略を機能させたい場合は、代わりに以下を試してください。

a <- vector(mode="list"); for (i in 1:1000) {if (123345 %% i == 0){ a <-c(a,i) } }
as.vector(unlist(a))
于 2010-09-16T02:41:08.053 に答える