#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