如何在 R 中将输出作为向量获取?
例如,如果我想拥有
for (i in 1:1000) {if i mod 123345 = 0, a = list(i)}
a
但我想找到所有i平均分为 123345 (即因子),而不仅仅是最大的。
可能有更简洁的方法可以做到这一点,但我会这样做:
i <- 1:1000
j <- i[12345 %% i == 0 ]
结果向量j包含 i 中的值的向量,这些值是 12345 的因数。在 R 中,模运算符是 %%,在您自己搜索时要找到它有点麻烦。它隐藏在算术运算符的帮助文档中,您可以通过搜索+which must be in quotes like:来找到它?"+",然后您必须仔细阅读。
如果您想找到 VBA 答案,最好添加 VBA 标签。但我怀疑它会涉及 VBA 模运算符;)
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的方法是赢家。
你写了:
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))