split_df <- function(df, ratio=.8, seed=123, floor=TRUE) {
set.seed(seed)
rand_idxs <- sample(1:nrow(df))
max_idx <- ifelse(floor, floor(ratio * nrow(df)), ceiling(ratio * nrow(df)))
first_indexes <- rand_idxs[1:max_idx]
second_indexes <- rand_idxs[(max_idx+1):nrow(df)]
res <- list(df[first_indexes, ],
df[second_indexes, ])
# attach info about used indexes
attrs(res, "indexes") <- list(first_indexes,
second_indexes)
res
}
Использование:
dfs <- split_df(df, ratio=.8, seed=123, floor=TRUE)
dfs[[1]] # data frame of the 80% randomly selected rows
dfs[[2]] # data frame of the rest 20% rows
# retrieve indexes used for splitting
attrs(dfs, "indexes")
Для экономии места в памяти я сохраняю только индексы, использованные для разделения поезда / теста, вместе с исходным df
. Это очень экономит память, сохраняя только индексы для разделения и отношения разделения.