如何在R中獲得輸出作爲向量?在循環中獲得輸出作爲R中的向量
例如,如果我想有
for (i in 1:1000) {if i mod 123345 = 0, a = list(i)}
a
,但我想找到整除到123345(即因素)所有i
,而不僅僅是規模最大的一次。
如何在R中獲得輸出作爲向量?在循環中獲得輸出作爲R中的向量
例如,如果我想有
for (i in 1:1000) {if i mod 123345 = 0, a = list(i)}
a
,但我想找到整除到123345(即因素)所有i
,而不僅僅是規模最大的一次。
可能有這樣做的更簡潔的方式,但我會做這種方式:
i <- 1:1000
j <- i[12345 %% i == 0 ]
得到的載體j
包含的值的矢量在我它們是12345因素就R modulo運算符是%%,在自己搜索時發現它有點麻煩。它隱藏在算術運算符的幫助文檔中,您可以通過搜索+
找到它,它必須用引號括起來,例如:?"+"
,然後你必須讀一點。
如果您想查找VBA答案,最好添加一個VBA標籤。但我懷疑這會涉及VBA模運算符;)
啊,很好 - 謝謝 – user446667 2010-09-15 20:38:00
您寫道:
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))
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龍的方法就是贏家。
在我的機器上,我得到了不同的時間,JD方法〜12.5s與你的方法〜11.5s。我正在使用R-2.11.1。 – Marek 2010-09-16 07:34:00
奇怪;在我的筆記本電腦上,R-2.11.1 JD - 12.92s,David - 5.49s,但重複1000次。 – mbq 2010-09-16 09:10:06
如果你想真正加速嘗試將所有東西都轉換爲'integer':'system.time(replicate(1e5,y [12345L %% y == 0L]))''。 ('0L'的意思是'as.integer(0)') – Marek 2010-09-18 14:56:58
另外,我會如何做同樣的事情在VBA? – user446667 2010-09-15 19:55:24