Двойной цикл для получения фрейма данных в R (tidyverse)

#r #dataframe #loops #tidyverse #lapply

#r #фрейм данных #циклы #tidyverse #lapply

Вопрос:

Я хочу повторить sample(1:11, 1) 6 раз в 5 разных раундах. В конечном выводе я хочу data.frame , чтобы каждый раунд был строкой (см. Ниже).

Достижимо ли это в tidyverse (например, purrr::map_df ) или БАЗОВОМ R?

 round1 4 5 6 7 8 9
round2 3 2 1 4 4 1
round3 5 4 2 2 1 1
round4 7 7 7 7 7 1
round5 1 8 8 8 8 1
  

Ответ №1:

Мы можем использовать replicate

 t(replicate(5, sample(1:11, 6, replace = TRUE)))
  

Как упоминал @thelatemail, мы можем sample только один раз поместить данные в матрицу.

 nr <- 5
nc <- 6
matrix(sample(1:11, nr * nc, replace = TRUE), nr, nc)
  

Комментарии:

1. Да, это похоже, но оно генерирует список. Итак, что-то вроде этого будет работать: bind_cols(t(rerun(5, sample(1:11, 6, replace = TRUE)))) где каждый столбец — один раунд.

2. Если вы сохраняете выходные данные выше в mat и каждый раунд представляет собой строку. Вы можете использовать apply : apply(mat, 1,function(x) c(median(x), IQR(x)))

3. Если replace=TRUE , почему бы не сделать один образец из 6 * 5 = 30 значений, а затем просто передать его в матрицу?

Ответ №2:

почему бы не использовать lapply для выборки 6 элементов 5 раз. флаг замены в примере дает возможность вытягивать одно и то же число более одного раза.

  data.frame(do.call(rbind, lapply(1:5,function(x) sample(1:11, 6, replace=T)))
  

Ответ №3:

Как и спрашивал OP purrr , вот решение tidyverse, которое получает имена строк, указанные в ожидаемом выводе:

 library(tidyverse)

rounds <- paste0("round", 1:5) 

rounds %>% 
  setNames(rounds) %>% 
  map_dfc(~sample(1:11, 6, replace = TRUE)) %>% 
  t()

       [,1] [,2] [,3] [,4] [,5] [,6]
round1    1   11   10    6    5   10
round2    9    2    3    3    2   10
round3    8    8    2   11    6    7
round4    1    7    8    6   11   10
round5    1    7    7    3    1    8