Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何优化r中10000次重复的分层随机抽样_R_Data.table_Simulation_Resampling - Fatal编程技术网

如何优化r中10000次重复的分层随机抽样

如何优化r中10000次重复的分层随机抽样,r,data.table,simulation,resampling,R,Data.table,Simulation,Resampling,我需要一个函数,该函数使用分层随机抽样从我的数据中重复(10000次)抽样,以改变样本大小,计算平均值和标准偏差,并返回每个样本大小的变异系数。样本量从3到30不等。 到目前为止,我已经写了这篇文章,但是写得太慢了。我需要帮助使它运行得更快,因为我多次运行这部分代码。 数据帧dt1有大约900个观测值 K_级别有6个级别 多谢各位 samp <- function(nn){ dt1 <- as.data.table(dt1) dt2 <- replicate(10000

我需要一个函数,该函数使用分层随机抽样从我的数据中重复(10000次)抽样,以改变样本大小,计算平均值和标准偏差,并返回每个样本大小的变异系数。样本量从3到30不等。 到目前为止,我已经写了这篇文章,但是写得太慢了。我需要帮助使它运行得更快,因为我多次运行这部分代码。 数据帧dt1有大约900个观测值 K_级别有6个级别

多谢各位

samp <- function(nn){
  dt1 <- as.data.table(dt1)
  dt2 <- replicate(10000, dt1[, .SD[sample(x = .N, size = nn)], by = K_level], 
          simplify =  FALSE) %>% 
  data.table::rbindlist() %>% 
  .[,.(avg=mean(Bunch_weight), Sd = sd(Bunch_weight)),.(Trt)] %>% 
  .[, cvs:= Sd/avg] 
  dt3 <-  data.table::transpose(dt2)
  colnames(dt3) <- as.character(dt3[1,])
  dt4 <- dt3 %>% .[-c(1:3),] %>% .[, sample:= paste0(nn,"mts")]
  return(dt4)
}
# use the function
zzz <- c(3:30)
dat5 <- map_df(.x = c(3:30), .f = samp)  

my data
Block Trt Matno Cycle Date.harvested Girth0 Girth100 Hands Fingers Bunch_weight    Variety K_level
  1:    B1  T2     6     1     2020-03-05      1        1     1       1            5     NFUUKA      0K
  2:    B1  T6     2     1     2020-03-05      2        2     2       1            9     KIBUZI    150K
  3:    B1  T6     3     1     2020-03-09      3        3     1       2            5     NFUUKA    150K
  4:    B1  T6    24     1     2020-02-28      4        4     2       1            9     KIBUZI    150K
  5:    B1  T6    29     1     2020-03-03      5        5     3       3           14     NFUUKA    150K
 ---                                                                                                   
780:    B3  T9    12     1     2020-05-22      4        4     4       4            8     NFUUKA      0K
781:    B3 T10    10     1     2020-05-25    145       47     5       5           17     NFUUKA      0K
782:    B3 T11    14     1     2020-05-16     27       88     4       4           13 MBWAZIRUME     75K
783:    B3 T14    25     1     2020-05-24     39      119     4       3           14    KISANSA    150K
784:    B3 T14    34     1     2020-05-17     27       28     5       3           15  NAKITEMBE    150K

expected output
 T9                T1                T6               T14               T13                T7               T15
1: 0.359418301512993 0.259396490785659 0.352112606549899 0.270098407993612  0.33255344147661 0.246297750226982 0.290376334651094
2:  0.36336940312546 0.260242995748078 0.347937570013322  0.26993786977025 0.327215546595358 0.247590005787063 0.290659581719395
                  T8                T3                T4               T18               T17               T10               T11
1: 0.203153174250691  0.31104051648633 0.308308574237779 0.352809537743834 0.380933443587759 0.345214551318585 0.265386556956891
2:  0.20127162406244 0.311140161227165 0.303006865683816 0.350513136037457  0.37965782184899 0.342121680883066  0.26389652807615
                  T5               T12               T16                T2 Sample
1: 0.424907358546752 0.262966077905422 0.292193075443918 0.366954072154349      3mts
2: 0.413114236465515 0.264733595838422 0.296869773806402  0.36574334095091      4mts
samp%
[,cvs:=Sd/avg]

dt3这是您的代码,只是稍微乱了一下。我认为它会产生相同的输出,但很难说,因为随机性是以不同的顺序进行的,所以重置随机种子没有帮助。它应该大大加快(超过10倍)


samp2您只需在
replicate
函数中计算统计信息,而不用绑定它。。您不需要存储data.frame。那是我的point@StupidWolf在replicate内部如何使其比管道更快?好的,hmmm这部分
replicate(10000,dt1[,.SD[sample(x=.N,…
),您将采样复制10000次并绑定列表,因此如果nn为3,您将有效地对其进行采样10000*nn*(可能是组数)如果我正确地得到了你的代码,那么它对我来说就没什么意义了。我会把它写成
replicate(10000,dt1[,.SD[sample(x=)…]>%calculate mean,cv)
最后,实际上,您只需要对向量进行采样
束重
,如果您将data.frame或data.table子集到need列,您将避免绑定data.frame的麻烦,从而加快了您的功能Thank you@pseudospin。这要快得多。我看到您正在以这种方式链接data.table,但仅此而已。为什么更快?我真的需要理解是什么让我的代码变慢,或者为什么你的代码变快。我怀疑链接根本不是问题所在-任何一种方式都可能是好的。这里的区别是按
K_级别
分组。你的分组10000次,然后将生成的整个数据表合并到一起。我的分组一次,然后选择10000个批次对于每个
K_级别
,一次对所有行进行排序。
samp2 <- function(nn){
  dt1 <- as.data.table(dt1)
  dt2 <- dt1[, .SD[as.vector(replicate(10000, sample(.N, nn)))], by = K_level, 
    .SDcols = c('Trt', 'Bunch_weight')][, 
      .(avg=mean(Bunch_weight), Sd = sd(Bunch_weight)), by = .(Trt)]
  dt2[, cvs:= Sd/avg]
  dt3 <-  data.table::transpose(dt2)
  colnames(dt3) <- as.character(dt3[1,])
  dt4 <- dt3 %>% .[-c(1:3),] %>% .[, sample:= paste0(nn,"mts")]
  return(dt4[])
}