随机分配给 training/testing 数据集时,将 R 数据框中的行分组在一起

Grouping rows from an R dataframe together when randomly assigning to training/testing datasets

我有一个由 X 行块组成的数据框,每行对应一个人(其中每个人的 X 可以不同)。我想将这些人随机分配到训练、测试和验证样本中,但到目前为止我还无法获得正确的语法以确保用户的 X 行中的每一个始终被收集到同一个子样本中。

例如,数据可以简化为:

user    feature1     feature2
 1        "A"           "B"
 1        "L"           "L"
 1        "Q"           "B"
 1        "D"           "M"
 1        "D"           "M"
 1        "P"           "E"
 2        "A"           "B"
 2        "R"           "P"
 2        "A"           "F"
 3        "X"           "U"
...       ...           ...

然后,如果我最终将用户随机分配给训练、测试或验证集,则该用户的所有行(用户编号是唯一的)将在同一组中,并分组在一起,这样如果例如,用户 1 在训练集中,那么格式仍然是:

user    feature1     feature2
 1        "A"           "B"
 1        "L"           "L"
 1        "Q"           "B"
 1        "D"           "M"
 1        "D"           "M"
 1        "P"           "E"

作为奖励,我很想知道这个解决方案是否可以扩展为进行 k 折交叉验证,但到目前为止我什至还没有想出这个更简单的第一步。

提前致谢。

我们可以先建立一个索引来表示每组数据。我选择了测试:60%、训练:40%、验证:10%,但您可以使用 sampleprob= 参数选择您需要的比率。然后我们将数据框拆分为user。最后,我们 rbind 基于我们创建的索引的用户。然后我们可以调用 all_dfs[['train']] 等等:

indx <- sample(1:3, length(unique(df$user)), replace=TRUE, prob=c(.6,.4,.1))
s <- split(df, df$user)
all_dfs <- lapply(1:3, function(x) do.call(rbind, s[indx==x]))
names(all_dfs) <- c('train', 'test', 'validation')