【问题标题】:get output as a vector in R during a loop在循环期间将输出作为 R 中的向量
【发布时间】:2011-04-12 21:16:01
【问题描述】:

如何在 R 中将输出作为向量获取?

例如,如果我想拥有

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

但我想找到所有i 均分到 123345(即因子),而不仅仅是最大的一个。

【问题讨论】:

  • 另外,我如何在 vba 中做同样的事情?

标签: vba r vector modulo


【解决方案1】:

可能有更简洁的方法可以做到这一点,但我会这样做:

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

生成的向量j 包含 i 中的值的向量,这些值是 12345 的因数。在 R 中,模运算符是 %%,在您自己搜索时很难找到它。它隐藏在算术运算符的帮助文档中,您可以通过搜索+ 找到它,它必须用引号括起来,例如:?"+",然后您必须仔细阅读。

如果您想找到 VBA 答案,最好添加 VBA 标签。但我怀疑它会涉及 VBA 模运算符 ;)

【讨论】:

    【解决方案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 的方法是赢家。

    【讨论】:

    • 在我的机器上我得到了不同的时间,JD方法~12.5s vs你的方法~11.5s。我正在使用 R-2.11.1。
    • 奇怪;在我的笔记本电脑和 R-2.11.1 JD 上——12.92 秒,大卫——5.49 秒,但重复 1000 次。
    • 如果您想真正加快速度,请尝试将所有内容转换为 integer: system.time(replicate(1e5, y[12345L %% y == 0L ]))。 (0L 表示as.integer(0)
    【解决方案3】:

    你写道:

    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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 2016-08-18
      • 2017-12-18
      相关资源
      最近更新 更多