【问题标题】:Count occurrences of condition in lapply计算 lapply 中出现的条件
【发布时间】:2012-08-07 15:14:53
【问题描述】:

我正在运行一个模拟,我需要跟踪特定条件的函数调用中出现的次数。我试图通过分配给全局对象来实现这一点。如果您运行该函数,但如果您尝试lapply 该函数就像我正在做的那样,它会起作用,那么您将获得条件发生的所有时间的单一计数,而不是每次发生在@中的每个元素的计数987654322@ 馈送到lapply

这是一个虚拟情况,出现的是一个数字的偶数:

FUN <- function(x){
    lapply(1:length(x), function(i) {
        y <- x[i]
        if (y %% 2 == 0){
            assign("count.occurrences", count.occurrences + 1, env=.GlobalEnv)   
        }
        print("do something")
    })
    list(guy="x", count=count.occurrences)
}

#works as expected
count.occurrences <- 0
FUN(1:10)


count.occurrences <- 0  
lapply(list(1:10, 1:3, 11:16, 9), FUN) 

#gives me...
#> count.occurrences
#[1] 9

#I want...
#> count.occurrences
#[1] 5  1  3  0

这是在模拟中,所以速度是个问题。我希望这尽可能快,这样我就不会接受全球任务的想法。

【问题讨论】:

  • 您希望我们改进您的单线解决方案吗?
  • @Andrie,感谢您的评论(+1),当我开始输入问题时,我根本想不出该怎么做,因为我没有考虑它是如何返回的@ 987654325@ 在列表中,但在我想到这个问题时输入了这个问题。无论如何,我认为全球分配的成本很高,并且有更好的方法来做到这一点。
  • 如果这是我能做的最好的,我将删除对我的问题的编辑并将其添加为答案。
  • 你也可以使用闭包来做到这一点,但我的观点是,如果你有一个简单、有效的解决方案,那就坚持下去。

标签: r


【解决方案1】:

与其分配给全局环境,不如直接分配给FUN的环境内部?

FUN <- function(x){
    count.occurances <- 0
    lapply(1:length(x), function(i) {
        y <- x[i]
        if (y %% 2 == 0){
            count.occurances <<- count.occurances + 1
        }
        print("do something")
    })
    list(guy="x", count=count.occurances)
}

Z <- lapply(list(1:10, 1:3, 11:16, 9), FUN) 

然后你就可以把计数拉出来了。

> sapply(Z, `[[`, "count")
[1] 5 1 3 0

【讨论】:

  • 我认为这是要走的路,尽管在此模拟中对它们中的任何一个进行基准测试都不在问题范围内。
【解决方案2】:

我没有对此进行任何基准测试,但是您是否尝试过仅使用for 循环?我知道在 R 中通常不鼓励循环,但它们也不总是较慢。

FUN <- function(x) {
  count.occurrences = 0
  for (i in 1:length(x)) {
    y = x[i]
    if (y %% 2 == 0) {
      count.occurrences = count.occurrences + 1
    }
    print("do something")
  }
  list(guy="x", count=count.occurrences)
}

lapply(list(1:10, 1:3, 11:16, 9), FUN)

【讨论】:

  • 哦,我修复了这个函数中出现的拼写;-)
  • 好点 mrdwab,我在这里展示了你所说的这个东西:stackoverflow.com/questions/10467322/…
  • 我发帖后懒得改拼写。在 R 中,它没有捕捉到拼写,但在帖子的标题中它做到了(我使用 chrome),所以我在那里修复了它。 :)
  • mrdwabb 这已经是一个重复循环并且严重嵌套在其中(我正在使用其他人的代码,这就是他们的工作方式),如果您有一个嵌套的循环,您建议的方法是否有效在一个循环中至少三次? (我很少使用循环所以不知道这个问题的答案)
  • @TylerRinker,对不起,但我不是循环和效率方面的专家,尤其是嵌套循环,所以我也没有这个问题的答案。
【解决方案3】:

我可以这样得到:

count.occurances <- 0  
Z <-lapply(list(1:10, 1:3, 11:16, 9), FUN) 
diff(c(0, sapply(1:length(Z), function(x) Z[[x]]$count)))

我对更好的想法持开放态度(更快)。

【讨论】:

    猜你喜欢
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 2021-12-31
    • 2020-09-29
    • 1970-01-01
    • 2021-10-24
    • 2022-01-14
    相关资源
    最近更新 更多