首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >统计lapply中条件的出现次数

统计lapply中条件的出现次数
EN

Stack Overflow用户
提问于 2012-08-07 23:14:54
回答 3查看 3.2K关注 0票数 4

我正在运行一个模拟,我需要跟踪特定条件的函数调用中出现的次数。我试图通过向全局对象赋值来实现这一点。如果你运行这个函数,它是有效的,但是如果你像我这样尝试lapply这个函数,你会得到一个关于所有条件发生次数的计数,而不是每次输入到lapplylist中每个元素发生的次数的计数。

这里是一个虚拟的情况,其中出现的是一个数字的均衡性:

代码语言:javascript
代码运行次数:0
运行
复制
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

这是在模拟中,所以速度是一个问题。我希望这件事越快越好,这样我就不会被全局赋值的想法困扰。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-08 00:36:46

与其分配给全局环境,为什么不直接分配给FUN的内部环境呢?

代码语言:javascript
代码运行次数:0
运行
复制
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) 

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

代码语言:javascript
代码运行次数:0
运行
复制
> sapply(Z, `[[`, "count")
[1] 5 1 3 0
票数 8
EN

Stack Overflow用户

发布于 2012-08-08 00:24:25

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

代码语言:javascript
代码运行次数:0
运行
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2012-08-08 00:23:35

我可以像这样得到它:

代码语言:javascript
代码运行次数:0
运行
复制
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)))

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11848984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档