2010-09-15 81 views
0

如何在R中獲得輸出作爲向量?在循環中獲得輸出作爲R中的向量

例如,如果我想有

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

,但我想找到整除到123345(即因素)所有i,而不僅僅是規模最大的一次。

+0

另外,我會如何做同樣的事情在VBA? – user446667 2010-09-15 19:55:24

回答

9

可能有這樣做的更簡潔的方式,但我會做這種方式:

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

得到的載體j包含的值的矢量在我它們是12345因素就R modulo運算符是%%,在自己搜索時發現它有點麻煩。它隱藏在算術運算符的幫助文檔中,您可以通過搜索+找到它,它必須用引號括起來,例如:?"+",然後你必須讀一點。

如果您想查找VBA答案,最好添加一個VBA標籤。但我懷疑這會涉及VBA模運算符;)

+0

啊,很好 - 謝謝 – user446667 2010-09-15 20:38:00

0

您寫道:

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

JD長的代碼是好多了,但如果你想要這個糊塗的戰略合作嘗試,而不是:

a <- vector(mode="list"); for (i in 1:1000) {if (123345 %% i == 0){ a <-c(a,i) } } 
as.vector(unlist(a)) 
2

JD龍的方法實在是浮現在腦海的第一個,但另一個問題:

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龍的方法就是贏家。

+0

在我的機器上,我得到了不同的時間,JD方法〜12.5s與你的方法〜11.5s。我正在使用R-2.11.1。 – Marek 2010-09-16 07:34:00

+0

奇怪;在我的筆記本電腦上,R-2.11.1 JD - 12.92s,David - 5.49s,但重複1000次。 – mbq 2010-09-16 09:10:06

+0

如果你想真正加速嘗試將所有東西都轉換爲'integer':'system.time(replicate(1e5,y [12345L %% y == 0L]))''。 ('0L'的意思是'as.integer(0)') – Marek 2010-09-18 14:56:58