随机分配给 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 折交叉验证,但到目前为止我什至还没有想出这个更简单的第一步。

提前致谢。

你可以使用 sample():

# 60 % for training, 20% for testing & validation
indeces <- sample(1:nrow(df),nrow(df)*0.6)
df.train <- df[indeces,]
df <- df[-indeces,]

indeces <- sample(1:nrow(df),nrow(df)*0.5)
df.test <- df[indeces,]
df.validate <- df[-indeces,]

对于 k 折交叉验证:

library(caret)
library(mlbench)
fld <- createFolds(df$your_dependent_variable, k= 10,list = TRUE, returnTrain = FALSE)

以上代码将数据分成 10 份。 运行 您在每个样本上的模型并对其进行验证。

已编辑:

user.df <- split( df , f = df$user )

这会生成一个单独的数据框,其中包含特定用户的数据。使用 user.df[[1]] 单独访问它们。