Как мне рандомизировать и l oop список категориальных переменных? - PullRequest
0 голосов
/ 17 марта 2020

Я практикуюсь с использованием l oop функций и хочу создать al oop, который будет случайным образом генерировать, кто из моих двоюродных братьев должен позвонить моей бабушке в течение 14 дней самоизоляции Ковида.

Я создал переменную «семья», в которой указывается, какие двоюродные братья (например, «Роб», «Давид», «Шанталь») принадлежат к какой тете или дяде быв. "Лаверна"). Тем не менее, я хочу попробовать только моих двоюродных братьев, а не тетей / дядей.

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

days <-14
family <- list("Laverne" = c("Rob", "David", "Chantal"), 
              "Jerry" = c("Amber", "Todd", "Kyla"), 
              "Gwen" = c("Kirk", "Heather"), 
              "Carleen" = c("Amber", "Chris", "Katelyn"), 
              "Al" = c("Regan", "Adam", "Dana", "Ally_Taylor"),
              "Celine" = c("Tyler", "Ashley", "Kayla", "Matthew"), 
              "Kathy" = c("Josh", "Cami", "Jessica", "Michelle", "Danielle"), 
              "Leanne" = c("Raylene", "Clinton", "Alina", "Tristina"),
              "Kim" = "Anthony_Emerson", 
              "Dawna"= "Leiland_Kelsey")

Я не слишком продвинулся в написании кода l oop. Это то, что я имею до сих пор:

for(i in family:n){
  sample1 <- sample(family, 1, replace = FALSE)
  resample <- sample(sample1)
}

Любая помощь будет оценена!

1 Ответ

0 голосов
/ 18 марта 2020

Вам, вероятно, также необходимо учитывать days.

# initialize matrix
samp <- matrix(NA, nrow=days, ncol=length(family), dimnames=list(NULL, names(family)))

set.seed(42)  ## for sake of reproducibility
for (j in 1:days) {
  for (i in 1:length(family)) {
    samp[j, i] <- sample(family[[i]], 1)
  }
}

Результат

samp 
#       Laverne   Jerry   Gwen      Carleen   Al            Celine    Kathy      Leanne     Kim               Dawna           
#  [1,] "Rob"     "Amber" "Kirk"    "Amber"   "Adam"        "Matthew" "Cami"     "Clinton"  "Anthony_Emerson" "Leiland_Kelsey"
#  [2,] "Chantal" "Kyla"  "Heather" "Amber"   "Regan"       "Ashley"  "Michelle" "Clinton"  "Anthony_Emerson" "Leiland_Kelsey"
#  [3,] "Chantal" "Amber" "Kirk"    "Katelyn" "Ally_Taylor" "Tyler"   "Danielle" "Raylene"  "Anthony_Emerson" "Leiland_Kelsey"
#  [4,] "Chantal" "Todd"  "Kirk"    "Chris"   "Ally_Taylor" "Ashley"  "Jessica"  "Alina"    "Anthony_Emerson" "Leiland_Kelsey"
#  [5,] "David"   "Todd"  "Kirk"    "Amber"   "Ally_Taylor" "Ashley"  "Cami"     "Alina"    "Anthony_Emerson" "Leiland_Kelsey"
#  [6,] "Rob"     "Amber" "Heather" "Chris"   "Adam"        "Ashley"  "Cami"     "Tristina" "Anthony_Emerson" "Leiland_Kelsey"
#  [7,] "Rob"     "Todd"  "Kirk"    "Chris"   "Adam"        "Ashley"  "Danielle" "Raylene"  "Anthony_Emerson" "Leiland_Kelsey"
#  [8,] "Rob"     "Todd"  "Kirk"    "Amber"   "Ally_Taylor" "Matthew" "Josh"     "Alina"    "Anthony_Emerson" "Leiland_Kelsey"
#  [9,] "Rob"     "Todd"  "Kirk"    "Chris"   "Adam"        "Ashley"  "Josh"     "Clinton"  "Anthony_Emerson" "Leiland_Kelsey"
# [10,] "Chantal" "Amber" "Heather" "Amber"   "Ally_Taylor" "Kayla"   "Cami"     "Clinton"  "Anthony_Emerson" "Leiland_Kelsey"
# [11,] "Rob"     "Todd"  "Kirk"    "Chris"   "Ally_Taylor" "Tyler"   "Josh"     "Tristina" "Anthony_Emerson" "Leiland_Kelsey"
# [12,] "Rob"     "Todd"  "Kirk"    "Amber"   "Adam"        "Matthew" "Danielle" "Alina"    "Anthony_Emerson" "Leiland_Kelsey"
# [13,] "Rob"     "Todd"  "Kirk"    "Amber"   "Dana"        "Matthew" "Cami"     "Alina"    "Anthony_Emerson" "Leiland_Kelsey"
# [14,] "Rob"     "Kyla"  "Kirk"    "Amber"   "Regan"       "Kayla"   "Josh"     "Clinton"  "Anthony_Emerson" "Leiland_Kelsey"

Без для l oop

Без for l oop Вы можете сделать (обратите внимание, что в этом случае нет необходимости инициализировать матрицу):

set.seed(42)
samp <- t(replicate(days, Map(`[`, family, lapply(lengths(family), function(x) 
  sample(seq(x), 1)))))
## with output similar to above
...