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