如何使用 R 创建独特的样本(每个元素仅出现在一个样本中)?
How to create unique samples (every element appears in one sample only) using R?
我正在使用 BTYD 模型生成对客户未来交易的预测。不幸的是,由于使用了 mcmc 方法,我无法 运行 对我的整个客户群(数十万)进行预测,因此我必须将基数分成许多随机样本并执行几个 运行他们每个人的这个模型来检索预测。
我的想法是使用循环来执行以下操作:
- 从整个碱基中获取长度为 10,000 的随机样本(我们称此数据框为 "data")
- 将结果存储在名为 "sample1"
的对象中
- 现在我们必须返回 "data" 并排除 "sample1" 中的客户并将新结果存储在 "data" 中。
- 从新的 "data"
中获取新的随机样本 ("sample2")
- 创建 "data" 的新版本,排除 "sample2"(和 "sample1")中包含的所有客户。
- ...继续这个循环,直到我们完成基础,并且我们创建了包含整个基础的 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 包含随机行号的向量。
我正在使用 BTYD 模型生成对客户未来交易的预测。不幸的是,由于使用了 mcmc 方法,我无法 运行 对我的整个客户群(数十万)进行预测,因此我必须将基数分成许多随机样本并执行几个 运行他们每个人的这个模型来检索预测。
我的想法是使用循环来执行以下操作:
- 从整个碱基中获取长度为 10,000 的随机样本(我们称此数据框为 "data")
- 将结果存储在名为 "sample1" 的对象中
- 现在我们必须返回 "data" 并排除 "sample1" 中的客户并将新结果存储在 "data" 中。
- 从新的 "data" 中获取新的随机样本 ("sample2")
- 创建 "data" 的新版本,排除 "sample2"(和 "sample1")中包含的所有客户。
- ...继续这个循环,直到我们完成基础,并且我们创建了包含整个基础的 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 包含随机行号的向量。