创建按组

时间:2017-04-10 12:18:13

标签: r dataframe split

我有一个数据框,我想按组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

1 个答案:

答案 0 :(得分:2)

以下是使用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")