Как создать образец из предыдущего образца фрейма данных - PullRequest
2 голосов
/ 08 мая 2020

Я создал фрейм данных с двумя переменными: одна с символами (командами) и одна числовая c. Я хотел бы сделать полную случайную выборку, чтобы выбрать две команды, а затем еще одну выборку между двумя избранными, чтобы получить только одну. Наконец, я хотел бы повторить это без того, чтобы первые две выбранные команды могли это повторить. Я пробовал с этим кодом. Однако, когда дело доходит до второй выборки, выборы происходят не из двух выбранных команд, а из двух других команд.

teams <- c('madrid','barcelona','psg','mancunited','mancity','juve')
mean  <- c(14, 14.5, 13, 10, 13.4, 13.7)
df    <- data.frame(teams, stats)
x     <- 1:nrow(df)


a1 <- df[sample((x),2),]
y  <- sample(c(a1[1,1], a1[2,1]), 1, 
           prob = c((a1[1,2]/(a1[1,2]+a1[2,2])), (a1[2,2]/(a1[1,2]+a1[2,2]))))
A1 <- df[y,]
A1

df <- df[!(df$teams==a1[1,1] | df$teams==a1[2,1]),]
x  <- 1:nrow(df)

b1 <- df[sample((x),2),]
B1 <- df[sample(c(b1[1,1], b1[2,1]), 1,  
                prob = c((b1[1,2]/(b1[1,2]+b1[2,2])), (b1[2,2]/(b1[1,2]+b1[2,2])))),]
B1

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Если вы хотите использовать столбец stats для взвешивания вероятности выбора при втором розыгрыше (выбирая 1 команду из 2 уже выбранных), вы можете использовать следующую функцию. Аргумент prob для sample может быть вектором вероятности весами . Таким образом, вам не нужно вычислять фактические пропорции вручную - просто укажите столбец stats, и R сделает то, что вы хотите.

game <- function(df){
  x     <- 1:nrow(df)
  a1 <-  df[sample((x),2),]
  y1  <- sample(a1$teams, 1, prob = a1$stats)

  df2 <- df[!(df$teams %in% a1$teams),]
  x  <- 1:nrow(df2)
  b1 <- df2[sample(x,2),]
  y2  <- sample(b1$teams, 1, prob = b1$stats)

  c(y1, y2)
}

Вот ваши данные:

teams <- c('madrid','barcelona','psg','mancunited','mancity','juve')
stats  <- c(14, 14.5, 13, 10, 13.4, 13.7)
df    <- data.frame(teams, stats) # R 4.0.0 no need to convert strings to factors.

Репликация 10 000 игр:

games <- t(replicate(10000, game(df)))

head(games)
#      [,1]        [,2]        
# [1,] "barcelona" "mancity"   
# [2,] "madrid"    "mancunited"
# [3,] "madrid"    "psg"       
# [4,] "juve"      "psg"       
# [5,] "mancity"   "barcelona" 
# [6,] "mancity"   "juve"

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

sort(prop.table(table(games[,1])), decr = TRUE) # phase 1

# barcelona     madrid        psg       juve    mancity mancunited 
#    0.1797     0.1787     0.1687     0.1677     0.1663     0.1389

sort(prop.table(table(games[,1])), decr = TRUE) # phase 2

# madrid  barcelona       juve    mancity        psg mancunited 
# 0.1826     0.1755     0.1691     0.1670     0.1663     0.1395
0 голосов
/ 08 мая 2020

Вы можете использовать:

#Choose two teams
random_2_x <- sample(x, 2)
#Chose one out of the above two
random_2_1_x <- sample(random_2_x, 1)

#Chose two from the one not in random_2_x
random_2_y <- sample(x[-random_2_x], 2)
#Chose one out of the above two
random_2_y_1 <- sample(random_2_y, 1)

Вы можете использовать эти индексы для подмножества из фрейма данных:

df[random_2_x, ]
#       teams mean
#4 mancunited 10.0
#6       juve 13.7

df[random_2_1_x, ]
#  teams mean
#6  juve 13.7

df[random_2_y, ]
#      teams mean
#1    madrid 14.0
#2 barcelona 14.5

df[random_2_y_1, ]
#      teams mean
#2 barcelona 14.5

data

df<- data.frame(teams, mean)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...