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包含 i 中的值的向量,这些值是 12345 的因数。在 R 中,模运算符是 %%,在您自己搜索时要找到它有点麻烦。它隐藏在算术运算符的帮助文档中,您可以通过搜索+which must be in quotes like:来找到它?"+",然后您必须仔细阅读。

如果您想找到 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 回答