【问题标题】:Create train test split by group创建按组拆分的火车测试
【发布时间】:2017-09-05 11:38:24
【问题描述】:

我有一个数据框,我想按组 ID 将其拆分为一个训练集和测试集。以下代码对随机行进行采样并将它们放入训练和测试 df:

samp <- sample(nrow(df), 0.7 * nrow(df))
train <- df[samp, ]
test <- df[-samp, ]

但是,我想将我的 ID 组合在一起。

示例输入 df:

my_dat <- data.frame(ID=as.factor(rep(1:3, each = 3)), Var=sample(1:100, 9))

  ID Var
  1  17
  1  26
  1 100
  2   9
  2  41
  2  49
  3  36
  3  18
  3   5

以及想要的输出到:

火车:

  ID Var
  1  17
  1  26
  1 100
  3  36
  3  18
  3   5

测试:

  ID Var
  2   9
  2  41
  2  49

【问题讨论】:

  • 然后对 id 进行采样。类似myIds &lt;- unique(df$id); myTrainers &lt;- sample(myIds, 2)。然后myTesters &lt;- myIds[!(myIds %in% myTrainers)].
  • 谢谢。然而,似乎有什么不对劲。 myTrainers myTesters 的输出分别为:[1] 2 3 Levels: 1 2 3[1] 1 Levels: 1 2 3
  • 你的变量是一个因子变量。这就是“级别:1 2 3”所指示的内容。如果您注意到第一部分,您可以看到任务已完成,myTrainers 获得 id 2 和 3,myTesters 获得 id 1。要将 id 转换为整数,您可以使用 as.integer,但您可能想要查看更接近该变量以及为什么将其作为因子变量读入。

标签: r dataframe split


【解决方案1】:

这是使用dplyr 的一种方法:

library(tidyverse)

# Create more data to better demonstrate grouping effect
my_dat <-
  data.frame(ID = as.factor(rep(1:3, each = 9)), Var = sample(1:100, 27))

# Randomly assign train/test groups to all values of ID
groups <-
  my_dat %>%
  select(ID) %>%
  distinct(ID) %>%
  rowwise() %>%
  mutate(group = sample(
    c("train", "test"),
    1,
    replace = TRUE,
    prob = c(0.5, 0.5) # Set weights for each group here
  ))

groups

# Join group assignments to my_dat
my_dat <- my_dat %>%
  left_join(groups)

my_dat

这种方法会保持原始数据不变,但会添加一个新列来定义每一行的组(训练与测试)。如果你想得到一个只有训练数据的数据框,你可以像这样过滤它:

filter(my_dat, group == "train")

【讨论】:

  • 谢谢。当我执行代码时,新列(group)只填充了test.,没有training.
  • 这很奇怪,@apples-oranges。您是否尝试过反复运行它?因为只有三个组和两个可能的值,所以在运行代码的 1/4 时间里,您只会得到一个结果。
  • 您最后一次更新dplyr 是什么时候?最近发生了一些重大变化。我刚刚重新安装了dplyrtidyverse,我的代码仍然可以正常运行。在添加 rowwise() 之前,我遇到了与您描述的相同的问题,直到去年 6 月才以当前形式存在。
  • 就是这样!如果你不介意,我还有一个问题。如何指定训练和测试拆分之间的比率。我的真实数据框是280万行,代码好像把它减半了。
  • 我刚刚编辑了我的答案以包括概率加权。将 prob 的两个值更改为您希望训练和测试的百分比。
猜你喜欢
  • 2020-08-03
  • 2017-02-21
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 2020-11-29
  • 1970-01-01
相关资源
最近更新 更多