【问题标题】:Construct a loop over function, and apply does not work.构造一个循环函数,并且 apply 不起作用。
【发布时间】:2011-10-14 15:57:03
【问题描述】:

我是 R 的新手,我想为 50 个后缀为 1 到 50 的不同数据(点名类)运行一个特定函数(理想的 pscl 包),我想保存结果在对象中也有 1 到 50 后缀,但我做不到。

应用不起作用,因为我需要在理想函数中指定附加参数,并且我已经尝试创建一个新函数来设置附加参数并允许仅使用数据指定函数,但它在第二步(不识别物体)。

我的函数有数据对象:rc.1, rc.2, ..., rc.50 并尝试执行以下操作 - 密切关注我在 Stata 中的操作方式...

for (i in 1:3) {
    est.leg[i]<-ideal(rc[i], maxiter=1000, burnin=500, thin=10, normalize=TRUE)
}

并且它不在 rc[i] 中评估,说“找不到对象 'rc'”

我也试过了:

loop.ideal<- function(zz){ 
   ideal(zz, d=1, maxiter=100, burnin=50, thin=10, normalize=TRUE)
}

但在测试函数时,它不适用于迭代。

非常感谢任何帮助!!!!

【问题讨论】:

  • 欢迎来到 StackOverflow!除非您提供其他人可以在自己的机器上运行的可重现示例,否则任何人都很难提供帮助。这将包括您数据的一小部分(使用dput())...
  • 我认为 lapply,正如 Joris 所建议的那样,是一种方式。但是你可能需要等待很长时间才能运行理想的 50 次。特别是如果数据不是那么小。不能并行运行吗?
  • @Manoel:按照下面@Joris 的解决方案,如果您使用的是多核Mac 或Linux 机器,您可以library(multicore); mclapply(...)
  • @Ben Bolker - 见this。所以,是的。 ;)

标签: r for-loop


【解决方案1】:

正如加文所说。

您可以遍历对象的名称,例如:

object.names <- paste("rc",1:50,sep=".")

最好是学会使用列表。您可以使用lapply

列出对象
object.list <- lapply(object.names,get)

这将使用函数get 对列表中的每个名称进行命名。 lapply 返回一个列表,因此您有一个对象列表。

如果函数正确,您可以再次对ideal 函数使用相同的技巧:

est.leg <- lapply(object.list,ideal , maxiter=1000, burnin=500, 
                  thin=10, normalize=TRUE)

这应该给出正确的解决方案。

【讨论】:

    【解决方案2】:

    可以将额外的参数传递给apply(),请参阅?apply 中的... 参数。如果你写的是正确的,你没有对象rc[i],你有rc.i,其中i实际上是一个整数。 [ 用于子集对象,因此您的代码要求 rc 对象的 ith 组件。您似乎想要检索名称为 rc.i 的对象,并将 i 替换为整数。

    如果不了解rc 等更多信息,您可以尝试使用get(paste("rc.", i, sep = "")) 代替rc[i]

    【讨论】:

      猜你喜欢
      • 2012-10-31
      • 2011-12-01
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多