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

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

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

  1. 从整个库中检索长度为10,000的随机样本(我们将此数据框称为“数据”)
  2. 将结果存储在名为“ sample1”的对象中
  3. 现在我们必须回到“数据”,排除“ sample1”中的客户并将新结果存储在“数据”中。
  4. 从新的“数据”中获取新的随机样本(“ sample2”)
  5. 创建一个新版本的“数据”,其中不包括“ sample2”(和“ sample1”)中包括的所有客户。
  6. ...继续此循环,直到完成基础并创建了包含整个基础的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)。

bbb06070241 回答:如何使用R创建唯一的样本(每个元素仅出现在一个样本中)?

请考虑按ID对整个数据进行随机重新排序,然后按相等长度的行拆分。最终结果将是一个包含许多数据帧的命名列表,而不是大量泛滥的全局环境中的单独对象。

<%= stylesheet_link_tag    'application',media: 'all','data-turbolinks-track': 'reload' %>

或者,您可以使用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# ... 拆分样本,并通过任何BTYD模型过程(类似于by + split)运行每个子集:

lapply
,

这是使用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只是一个字符串(数据帧的名称,而不是数据帧本身)

,

这是一种紧凑的方法,可以使用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包含随机行号的向量。

本文链接:https://www.f2er.com/3132709.html

大家都在问