【问题标题】:Retaining those replicates of a function which do not produce error保留那些不会产生错误的函数的副本
【发布时间】:2019-12-10 21:49:33
【问题描述】:

假设我有一个函数,它在样本量很大时返回结果而没有任何错误。当 n 很小时,对于少数特定数据集,该函数会产生错误,我只想完全排除这些复制并与其他没有任何问题的复制一起使用。但是一旦任何复制产生错误,所有其他执行的复制都将变得不可用。例如,考虑下面的玩具示例:

sim <- function(n){

x <- rbinom(n,1,0.3)
a <- x[1:(n/2)]
b <- x[((n/2)+1):n]
d <- c(table(a)[[1]],table(a)[[2]],table(b)[[1]],table(b)[[2]])
return(d)

}

 set.seed(5)
 ans1 <-replicate(100,sim(100))
 ans2 <- replicate(100,sim(30))#Error in table(b)[[2]] : subscript out of bounds

在此示例中,我想保留那些具有所有四个单元格 c(table(a)[[1]],table(a)[[2]],table(b)[[1]],table(b)[[2]]) 的 ans2 副本。并删除那些产生错误的重复。有办法解决吗?

【问题讨论】:

    标签: r statistics


    【解决方案1】:

    使用try,然后删除类try-error的任何内容:

    sim <- function(n){
      try({
        x <- rbinom(n,1,0.3)
        a <- x[1:(n/2)]
        b <- x[((n/2)+1):n]
        d <- c(table(a)[[1]],table(a)[[2]],table(b)[[1]],table(b)[[2]])
        return(d)
      }, silent = TRUE)
    }
    
    set.seed(5)
    ans2 <- replicate(100,sim(30))
    
    indx <- vapply(ans2, class, NA_character_) != "try-error"
    ans2 <- ans2[indx]
    

    【讨论】:

      【解决方案2】:

      我的猜测是您正在尝试将向量拆分为 2 并计算 0 和 1 的数量。一种解决方案是首先创建另一个向量,将 0 和 1 分成 2:

      x = c(rep(0,5),c(1,1,1,0,0))
      a_or_b <- 1:10 > 10/2
      

      我们可以看到上面分割了 0 和 1:

      cbind(x,a_or_b)
      
            x a_or_b
       [1,] 0      0
       [2,] 0      0
       [3,] 0      0
       [4,] 0      0
       [5,] 0      0
       [6,] 1      1
       [7,] 1      1
       [8,] 1      1
       [9,] 0      1
      [10,] 0      1
      

      现在我们使用表格:

      table(x,a_or_b)
      
         a_or_b
      x   FALSE TRUE
        0     5    2
        1     0    3
      

      现在我们把它写成一个函数:

      sim <- function(n){
      
      x <- rbinom(n,1,0.3)
      a_or_b <- 1:n > n/2
      return(c(table(x,a_or_b)))
      }
      
      replicate(100,sim(30))
      #no error
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 2021-12-06
        • 1970-01-01
        • 2016-10-27
        • 1970-01-01
        • 2014-01-27
        相关资源
        最近更新 更多