Как создать цикл для повторения процедуры случайной выборки в R

Я написал код на R для выборки без замены из 3 отдельных векторов (list1, list2, list3). Я отбираю 10 раз из списка 1, 20 раз из списка 2 и 30 раз из списка 3. Затем я объединяю 3 списка случайных выборок и проверяю, сколько раз я выбирал одну и ту же строку 2 или 3 раза. Как мне автоматизировать это, чтобы я мог 100 раз выбрать и получить распределение частот? Например, я хочу увидеть, как часто я произвольно выбираю одну и ту же строку из всех трех списков. Спасибо за помощь.

Все входные данные представляют собой списки из тысяч строк, например:

list1:

     V1         
[1,] "EDA"
[2,] "MGN2"  
[3,] "5RSK"      
[4,] "NBLN"

Мой текущий код:

sample_list1 <-(sample(list1,10, replace=FALSE))
sample_list2 <-(sample(list2,20, replace=FALSE))
sample_list3 <-(sample(list3,20, replace=FALSE))

combined_randomgenes <- c(list1, list2, list3)
combined_counts <- as.data.frame(table(combined_randomgenes))

overlap_3_lists <- nrow(subset(combined_counts, Freq == 3))
overlap_2_lists <- nrow(subset(combined_counts, Freq == 2))

Если бы в моих 3 случайных выборках была только 1 строка, которая встречалась во всех 3 случайных выборках, тогда я ожидал бы, что overlap_3_lists будет содержать значение 1. Я хотел бы автоматизировать, чтобы получить распределение значений, чтобы я мог построить гистограмму для посмотрите, сколько раз бывает 0, 1, 2, 3 и т. д. одинаковых строк, которые выбираются во всех 3 списках.


person user964689    schedule 24.08.2016    source источник


Ответы (2)


В третьем примере вы захотите изменить 20 на 30. Кроме того, ваш комбинированный_randomgenes должен ссылаться на файл sample_listx. Затем просто поместите вокруг него код цикла и присвойте результаты. Бонусные советы: будьте осторожны с использованием subset в скрипте и установите начальное число так, чтобы ваша работа была воспроизводимой.

set.seed(1234)

list1 <- 1:60
list2 <- 1:60
list3 <- 1:60

n <- 100
runs <- data.frame(run=1:n,threes=NA,twos=NA)
for(i in 1:n) {
  sample_list1 <-(sample(list1,10, replace=FALSE))
  sample_list2 <-(sample(list2,20, replace=FALSE))
  sample_list3 <-(sample(list3,30, replace=FALSE))

  combined_randomgenes <- c(sample_list1, sample_list2, sample_list3)
  combined_counts <- as.data.frame(table(combined_randomgenes))

  runs$threes[i] <- sum(combined_counts$Freq==3)
  runs$twos[i] <- sum(combined_counts$Freq==2)
}

runs
hist(runs$threes,5)
hist(runs$twos,5)
person ddunn801    schedule 24.08.2016

Вы также можете попробовать использовать mapply(), немного более читаемый, например:

my_list <- list( A= 1:8, B= 1:8, C= 1:8)

my_list_sampled <- mapply(sample, size = c(5,5,3), my_list )
names(my_list_sampled) <- names(my_list)


result<- table(stack(my_list_sampled))

hist(result)

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

result_all_3 <- (result == "3")

Или посчитайте перекрытие вот так

result <- data.frame(ifelse(result> 0, 1, 0))

result$overlap <- rowSums(result)

hist(result$overlap)
person USER_1    schedule 24.08.2016