如何将输出作为R中的向量?
例如,如果我想拥有
for (i in 1:1000) {if i mod 123345 = 0, a = list(i)}
a
但我希望找到均匀分配到123345(即因子)的所有i
,而不仅仅是最大的那些。
答案 0 :(得分:9)
可能有一种更简洁的方法可以做到这一点,但我会这样做:
i <- 1:1000
j <- i[12345 %% i == 0 ]
结果向量j
包含i中值为12345的因子的向量。在R中,模运算符是%%,当你自己搜索时,它是一个很难找到的婊子。它隐藏在算术运算符的帮助文档中,你可以通过搜索+
来找到它,它必须是引号,如:?"+"
,然后你必须读一下。
如果要查找VBA答案,最好添加VBA标记。但我怀疑它将涉及VBA模运算符;)
答案 1 :(得分: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的方法就是赢家。
答案 2 :(得分: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))