Как создать фрейм данных со строками и столбцами для функции в R? - PullRequest
1 голос
/ 23 октября 2019

Мне был задан вопрос, который требует от меня создания фрейма данных для функции, и я не знаю, как с ним работать.

Чтобы оценить стратегии остановки и переключения, мы должны повторитьИгра много раз, чтобы определить пропорцию побед на основе каждой стратегии. Для этого напишите другую функцию с именем monty_hall(), которая имеет один аргумент iter, количество итераций и возвращает фрейм данных с iter строками и пятью столбцами. Эта функция должна вызывать функцию monty_hall_one_play(). Возможно, вам захочется написать цикл какого-либо типа или попробовать replicate().

Столбцы фрейма данных, которые должна возвращать функция monty_hall():

  • car_door, дает дверь, за которой скрыт автомобиль.

  • contestant_door, дает дверь, первоначально выбранную участником.

  • host_door, открывает дверь, указанную хозяином.

  • switch, результат стратегии переключения;1 - победа, 0 - проигрыш.

  • stay, результат стратегии пребывания;1 - выигрыш, 0 - проигрыш.

Пока мой код выглядит так:

monty_hall <- function(iter) {
  replicate(iter,monty_hall_one_play())
}
monty_hall(5)

Мой код для функции monty_hall_one_play равен

monty_hall_one_play <- function() {
  first <- sample(x = c(1:3),size = 1,replace = FALSE,prob = c(1/3,1/3,1/3))
  second <- sample(x = c(1:3),size = 1,replace = FALSE,prob = c(1/3,1/3,1/3))

  if (first == 1 & second == 1) {
    third = sample(c(2,3),1)
  }
  if (first == 2 & second == 2) {
    third = sample(c(1,3),1)
  }
  if (first == 3 & second == 3) {
    third = sample(c(1,2),1)
  }
  if (first == 1 & second == 2) {
    third = 3
  }
  if (first == 2 & second == 3) {
    third = 1
  }
  if (first == 3 & second == 1) {
    third = 2
  }
  if (first == 2 & second == 1) {
    third = 3
  }
  if (first == 3 & second == 2) {
    third = 1
  }
  if (first == 1 & second == 3) {
    third = 2
  }

  return(c(first,second,third))
}

«Первое», «второе» и «третье» соотносятся с назначенными элементами.

Это были направления:

Напишите функцию с именем monty_hall_one_play(), котораяне принимает аргументов и возвращает числовой вектор с каждым элементом, представляющим следующее:

  • первый элемент - дверь, за которой скрыт автомобиль (выбирается случайным образом из 1:3)

  • вторым элементом является дверь, первоначально выбранная участником (выбранная случайным образом из 1:3)

  • третий элемент - дверь, открываемая хозяином

  • если участник выбрал дверь с автомобилем, ведущий случайным образом выбирает одну из двух оставшихся дверей

  • , если участник выбрал дверьотличается от двери с машиной, хозяин выбирает дверь, которая не спрятанаВ машине

Я не уверен, как создать фрейм данных и саму функцию.

1 Ответ

1 голос
/ 23 октября 2019

as.data.frame и colnames в вашей функции должно быть достаточным.

monty_hall <- function(iter) {
   results <- replicate(iter, monty_hall_one_play())
   results <- as.data.frame(results)
   colnames(results) <- c(
      "car_door", "contestant_door", "host_door",
      "switch", "stay"
   )
   return(results)
} 

result

> monty_hall(5)        
  car_door contestant_door host_door switch stay
1        1               3         2      3    1
2        2               2         2      3    2
3        3               1         1      2    3

Или, если вы хотите быть аккуратным об этом.

monty_hall <- function(iter) {
   replicate(iter, monty_hall_one_play()) %>%
      as.data.frame %>%
      set_names("car_door", "contestant_door", "host_door", "switch", "stay")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...