如何从观察到的变化的数据集中有效采样?

问题描述

我有一个具有以下格式的大型数据表:

library(data.table)
library(string)
library(plyr)

dt <- data.table(
  from = rep(LETTERS[1:10],each=3),to = rep(letters[1:3],10),from_n = rep(sample(50:100,to_n = rep(sample(1:10,3,replace = T),10)
)

我正在尝试将数据集分为随机抽样的测试和训练数据集,其中包含每个组(“ from”)的观测值(“ from_n”)的80%和20%。

我目前可以使用for循环并创建随机混洗的矢量来进行此操作。例如:

test_list <- list()
train_list <- list()
for (i in 1:length(unique(dt$from))){ # for each unique "from"
  sub <- dt[from == unique(dt$from)[i]] 
  n_1 <- sub$to_n[1] 
  n_2 <- sub$to_n[2]
  n_3 <- sub$to_n[3]
  n_NA <- sub$from_n[1] - sum(n_1,n_2,n_3)
  sample_vec <- sample( c( rep(NA,n_NA),# create randomised vector 
                           rep(sub$to[1],n_1),rep(sub$to[2],n_2),rep(sub$to[3],n_3) ) )
  
  train <- sample_vec[1:floor(length(sample_vec)*0.8)]
  train_dt <- data.table(from = sub$from,to = sub$to,from_n = rep(length(train),3),to_n = c(length(train[which(train == sub$to[1])]),length(train[which(train == sub$to[2])]),length(train[which(train == sub$to[3])])
                                  ))
  
  test <- sample_vec[(floor(length(sample_vec)*0.8)+1):length(sample_vec)]
  test_dt <- data.table(from = sub$from,from_n = rep(length(test),to_n = c(length(test[which(test == sub$to[1])]),length(test[which(test == sub$to[2])]),length(test[which(test == sub$to[3])])
                         ))
  
  test_list[[i]] <- test_dt
  train_list[[i]] <- train_dt
}

但是,我需要将此应用于的数据集非常大,而且速度太慢。有人对我如何提高性能有任何建议吗?

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)