Пропорциональное разбиение фрейма данных в R - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть фрейм данных (df) с 32 832 строками. Используя функцию split.seed, как я могу разделить ее на два отдельных фрейма данных? Один с 80% строк df, а другой с 20% строк df?

Я создал один из нужных фреймов данных, введя ...

set.seed(123)
newDF <- df[sample(round(.8*nrow(df))),]

Но я не могу понять, как вывести оставшиеся 20% df в отдельный фрейм.

Ответы [ 2 ]

4 голосов
/ 04 апреля 2020

Рассмотрим отрицательный индекс:

set.seed(123)
sample_rows <- sample(round(.8*nrow(df)))

new_df_80 <- df[sample_rows,]
new_df_20 <- df[-sample_rows,]
0 голосов
/ 04 апреля 2020
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. Это очень экономит память, сохраняя только индексы для разделения и отношения разделения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...