Как случайным образом объединить разные кадры данных по строкам в R - PullRequest
1 голос
/ 21 марта 2020

У меня есть фреймы данных Relaxed.swimming, Intense.swimming, Resting и Burst. Они разделяют количество столбцов (4 столбца), но различаются по количеству строк. Как пример:

Relaxed.swimming <- data.frame(Behaviour= "Relaxed.swimming",
                               disurge=c(0.015,0.908,0.345,0.489),
                               diheave=c(0.398,0.782,0.198,0.634),
                               disway=c(0.491,0.398,0.189,0.592))

Intense.swimming <- data.frame(Behaviour= "Intense.swimming",
                               disurge=c(0.015,0.908,0.345),
                               diheave=c(0.398,0.782,0.198),
                               disway=c(0.491,0.398,0.189))


Burst <- data.frame(Behaviour= "Burst",
                    disurge=c(0.015,0.908),
                    diheave=c(0.398,0.782),
                    disway=c(0.491,0.398))

Resting <- data.frame(Behaviour= "Resting",
                      disurge=c(0.015,0.908,0.345),
                      diheave=c(0.398,0.782,0.198),
                      disway=c(0.491,0.398,0.189))

Я просто хочу объединить их по строкам (сохраняя 4 столбца). Дело в том, что я хочу объединить их сотни или тысячи раз, и я хочу объединить их случайным образом, то есть порядок постоянно меняется (т.е. rbind(Relaxed.swimming, Intense.swimming, Resting, Burst, Resting, Intense.swimming, Relaxed.swimming, Resting, etc)). Хотя я хочу объединить их случайным образом, я хочу сохранить пропорции (четыре вектора повторяются примерно одинаковое количество раз). Крыса ios не обязательно должна быть точно 1: 1: 1: 1, но они должны быть близко.

Я бы хотел получить что-то подобное:

> df
          Behaviour disurge diheave disway
1           Resting   0.015   0.398  0.491
2           Resting   0.908   0.782  0.398
3           Resting   0.345   0.198  0.189
4             Burst   0.015   0.398  0.491
5             Burst   0.908   0.782  0.398
6  Intense.swimming   0.015   0.398  0.491
7  Intense.swimming   0.908   0.782  0.398
8  Intense.swimming   0.345   0.198  0.189
9  Relaxed.swimming   0.015   0.398  0.491
10 Relaxed.swimming   0.908   0.782  0.398
11 Relaxed.swimming   0.345   0.198  0.189
12 Relaxed.swimming   0.489   0.634  0.592
13            Burst   0.015   0.398  0.491
14            Burst   0.908   0.782  0.398
15 Relaxed.swimming   0.015   0.398  0.491
16 Relaxed.swimming   0.908   0.782  0.398
17 Relaxed.swimming   0.345   0.198  0.189
18 Relaxed.swimming   0.489   0.634  0.592
.          .            .       .      .
.          .            .       .      .
.          .            .       .      .

Как можно получить большой фрейм данных, полученный в результате случайной репликации 4 упомянутых фреймов данных?

Кто-нибудь знает, как это сделать?

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 21 марта 2020

Если пропорции не обязательно должны совпадать на 100%, тогда это решение dplyr должно работать:

В первой строке свяжите четыре кадра данных вместе:

library(dplyr)
All <- rbind(Relaxed.swimming, Intense.swimming, Burst, Resting)

Затем сгруппируйте их по Behavior и нарисуйте случайную выборку любого размера. Случайные выборки обычно сохраняют внутренние пропорции без изменений:

All_s <- All %>% sample_n(1000, replace = T)

All_s[1:10,]
          Behaviour disurge diheave disway
1  Intense.swimming   0.015   0.398  0.491
2           Resting   0.345   0.198  0.189
3             Burst   0.345   0.198  0.189
4  Relaxed.swimming   0.345   0.198  0.189
5  Intense.swimming   0.489   0.634  0.592
6             Burst   0.345   0.198  0.189
7  Relaxed.swimming   0.345   0.198  0.189
8           Resting   0.489   0.634  0.592
9           Resting   0.015   0.398  0.491
10 Intense.swimming   0.241   0.241  0.241 
2 голосов
/ 21 марта 2020

попробуйте сделать это

library(tidyverse)
df_list <- list(Relaxed.swimming, Intense.swimming, Burst, Resting)

sample(df_list, 1, size = 10) %>% bind_rows()
1 голос
/ 21 марта 2020

Ответы, возможно, пока что не делают столько перетасовок, сколько заданный вопрос. Из примера, желаемого результата, кажется, что конечный результат должен иметь немного более тасовку, например, фрейм данных Burst имеет три строки, но в примере вывода есть только две строки с Burst рядом друг с другом. Эта функция реплицирует список фреймов данных, объединяет их в случайном порядке, а затем при необходимости перемешивает строки еще раз.

random_replicate <- function(list_of_dataframes, n = 2, extra_shuffle = TRUE){
  n_frames <- length(list_of_dataframes)
  replicated <- replicate(n, do.call(rbind, sample(frames, n_frames)), simplify = FALSE)
  combined <- do.call(rbind, replicated)
  if (extra_shuffle) combined <- combined[sample.int(nrow(combined)),]
  return(combined)
}
list_of_dataframes <- list(Relaxed.swimming, Intense.swimming, Burst, Resting)

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