R等采样需要太长时间

时间:2016-06-01 13:00:08

标签: r optimization time sample random-sample

我想在给定一些约束的情况下对来自不同年份的行进行抽样。

假设我的数据集如下所示:

library(data.table)
dataset = data.table(ID=sample(1:21), Vintage=c(1989:1998, 1989:1998, 1992), Region.Focus=c("Europe", "US", "Asia"))
> dataset
    ID Vintage Region.Focus
 1:  7    1989       Europe
 2: 10    1990           US
 3: 20    1991         Asia
 4: 18    1992       Europe
 5:  4    1993           US
 6: 17    1994         Asia
 7: 13    1995       Europe
 8:  9    1996           US
 9: 12    1997         Asia
10:  3    1998       Europe
11: 11    1989           US
12: 14    1990         Asia
13:  8    1991       Europe
14: 16    1992           US
15: 19    1993         Asia
16:  1    1994       Europe
17:  5    1995           US
18: 15    1996         Asia
19:  6    1997       Europe
20: 21    1998           US
21:  2    1992         Asia
    ID Vintage Region.Focus

我希望在两年内传播1000幅样本大小为2和4(彼此分开)。例如。对于1,000抽样的样本大小2,它可以是第一行和第二行。我还有一个约束,即样本必须由具有相同区域焦点的行组成。我的解决方案是下面的代码,但它太慢了。

for(i in c(2,4)) {
  simulate <- function(i) {
    repeat{
      start <- dataset[sample(nrow(dataset), 1, replace=TRUE),]
      t <- start$Vintage:(start$Vintage + 1)
      matches <- which(dataset$Vintage %in% t & dataset$Region.Focus == start$Region.Focus) #constraints
      DT <- dataset[matches,]
      DT <- as.data.table(DT)
      x <- DT[,.SD[sample(.N,min(.N,i/length(t)))],by = Vintage]
      if(nrow(x) ==i) {
        x <- as.data.frame(x)
        x <- x %>% mutate(EqualWeight = 1 / i) %>% mutate(RandomWeight = prop.table(runif(i)))
        x <- ungroup(x)
        return(x)
      } else {
        x <- 0
      }
    }

  }
  #now replicate the expression 1000 times
  r <- replicate(1000, simulate(i), simplify=FALSE)
  r <- rbindlist(r, idcol="draw")
  f <- as.data.frame(r)
  write.csv(p, file=paste("Performance.fof.5", i, "csv", sep="."))
  fof <- paste("fof.5", i, sep = ".")
  assign(fof, f)
}

此代码非常慢。我最初的直觉是,由于约束,我的方法需要大量资金并保持循环。我有5,800行。

除了重复功能之外,还有其他方法导致大量循环吗?也许还有另一种方法来表达行DT[,.SD[sample(.N,min(.N,i/length(t)))],by = Vintage]以摆脱重复表达?提前感谢您的任何意见!

0 个答案:

没有答案