如何使用 R 创建独特的样本(每个元素仅出现在一个样本中)?

How to create unique samples (every element appears in one sample only) using R?

我正在使用 BTYD 模型生成对客户未来交易的预测。不幸的是,由于使用了 mcmc 方法,我无法 运行 对我的整个客户群(数十万)进行预测,因此我必须将基数分成许多随机样本并执行几个 运行他们每个人的这个模型来检索预测。

我的想法是使用循环来执行以下操作:

  1. 从整个碱基中获取长度为 10,000 的随机样本(我们称此数据框为 "data")
  2. 将结果存储在名为 "sample1"
  3. 的对象中
  4. 现在我们必须返回 "data" 并排除 "sample1" 中的客户并将新结果存储在 "data" 中。
  5. 从新的 "data"
  6. 中获取新的随机样本 ("sample2")
  7. 创建 "data" 的新版本,排除 "sample2"(和 "sample1")中包含的所有客户。
  8. ...继续这个循环,直到我们完成基础,并且我们创建了包含整个基础的 N 个样本。

(每个ID只能在一个样本中)。

不幸的是,我的代码似乎没有按我想要的方式工作(我目前不太擅长循环。


getwd()

data<-read.csv("MOCK_DATA (1).csv") 
# this is a fake dataset of 1000 rows that contains only 2 columns: 
# customer ID (column name: "id") and a random number (column name "value").
# Every customer ID appears only once in the dataset.

head(data)

set.sample.size<-100
num.cycles<-ceiling(nrow(data)/set.sample.size)

for(i in 1:(num.cycles)) {
 nam <- paste("sample_", i, sep = "")
 assign(nam, data[sample(nrow(data), set.sample.size), ])
 data<-data[!(data$id %in% nam$id),]
}

此代码生成以下错误: nam$id 中的错误:$ 运算符对于原子向量无效

我期望得到 10 个名为 "sample_1".."sample_10" 的对象,每个对象都由原始数据中的 100 个随机 ID 组成,但都是唯一的(10 个样本之间没有共享 ID ).

这是一个使用 iris 数据集

的可重现示例
set.sample.size<-10

num.cycles<-ceiling(nrow(iris)/set.sample.size)


iris$id <- 1:150 


for(i in 1:(num.cycles)) {
  nam <- paste("sample_", i, sep = "")
  assign(nam, iris[sample(nrow(iris), set.sample.size), ])
  iris<-iris[!(iris$id %in% get(nam)$id),]
}

代码中的唯一问题是 nam$id 没有意义,因为 nam 只是一个字符串(数据框的名称,而不是数据框本身)

考虑按 ID 随机重新排序整个数据,然后按等长行拆分。最终结果将是一个包含许多数据框的命名列表,而不是许多单独的对象充斥着您的全球环境。

set.seed(11092019)

# RE-ORDER DATA FRAME (SAME LENGTH)
data <- with(data, data[order(sample(id, nrow(data))),])

# BUILD A LIST OF DFs 
set.sample.size <- 100
data$cycles_group <- paste0("sample_", ceiling(1:nrow(data)/set.sample.size))

df_list <- split(data, data$cycles_group)

# RETRIEVE INDIVIDUAL DF BY NAME
df_list$sample_1#
df_list$sample_2#
df_list$sample_3#
...

或者,使用 by 您可以通过任何 BTYD 模型过程拆分样本和 运行 每个子集(类似于 split + lapply):

results_list <- by(data, data$cycles_group, function(sub_df) {
   # ... do something with sub_df ...
})

这是一种使用 mtcars 作为数据集获取样本列表的紧凑方法,无需使用显式循环,样本大小 = 8:

n <- nrow(mtcars)
s <- sample(1:n, replace=FALSE)
sampsize <- 8
nsamps <- n / sampsize
m <- matrix(s, nrow = sampsize)
samps <- lapply(1:nsamps, function(x) mtcars[m[, x], ] )

这些行是使用向量 s 隐式随机选择的。矩阵 m 包含随机行号的向量。