Как выбрать строки без замены внутри (нескольких) подгрупп в R - PullRequest
0 голосов
/ 11 декабря 2018

У меня проблема с рандомизацией / выборкой, я не могу разобраться.Допустим, я хочу создать рандомизированный порядок представления стимулов в эксперименте с двумя переменными, цветом и элементом, каждый из которых имеет три уровня.

library(dplyr)
set.seed(42)

participant_id <- 1:12
colour <- c("blue", "green", "red")
item <- c("apple", "banana", "pear")

Я хочу, чтобы каждый участник видел случайное сочетание цвета и элемента в случайном порядке в списке, но никогда не видел отдельного значения более одного раза.

Я могу приблизиться к приведенному ниже коду - каждый участник видит каждый цвет один раз в случайном порядке - но не может придумать, как обеспечить, чтобы элемент, связанный с каждым цветом, также появлялся без повторения.

# dataframe of all possible combinations
all_permutations <- crossing(participant_id, colour, item) 

my_list <- all_permutations %>%
  group_by(participant_id, colour) %>%
  # randomly sample one row of item, per colour and participant  
  sample_n(1) %>% 
  group_by(participant_id) %>% 
  # randomly re-order within grouping
  sample_frac()

head(my_list, 15) 

# A tibble: 15 x 3
# Groups:   participant_id [5]
   participant_id colour item  
            <int> <chr>  <chr> 
 1              1 blue   pear  
 2              1 red    apple 
 3              1 green  pear  
 4              2 green  banana
 5              2 blue   pear  
 6              2 red    banana
 7              3 blue   pear  
 8              3 green  apple 
 9              3 red    banana
10              4 red    pear  
11              4 green  banana
12              4 blue   pear  
13              5 red    banana
14              5 green  apple 
15              5 blue   pear  

Любые предложения с благодарностью приняты!Заранее спасибо.

1 Ответ

0 голосов
/ 11 декабря 2018

Вот базовое решение R.Если вы хотите сэмплировать все элементы вектора ровно один раз, просто sample(vec), и он вернет перестановку vec.

set.seed(42)
res <-lapply(participant_id, function(p){
  data.frame(participant_id = rep(p, length(item)),
             colour = sample(colour), item = sample(item))
})
res <- do.call(rbind, res)
res
...