Как я могу изменить свои существующие R-коды с выхода случайной выборки на список всех возможных результатов? - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть следующие R коды, работающие в RStudio:

foo <- list(
  c(1, 2, 3, 5, 6, 7, 8, 9),  
  c(11, 13, 15, 16, 17, 19),  
  c(21, 25, 28, 29),  
  c(31, 33, 34, 35, 37, 38, 40) 
)

names(foo) <- c(2, 1, 2, 1)

is.odd <- function(x) x %% 2 != 0

countOdds <- function(dt) {
  sum(sapply(dt, is.odd))
  }


while(TRUE) {
  list2 <- unlist(sapply(seq_along(foo), function(x) 
    sample(foo[[x]], names(foo[x]))))
  if(countOdds(list2) == 2)
    break
}

sort(list2)

Что делают действительные коды:

Выход является случайным выходом (1 единственный результат) извсе возможные результаты.

Example: 2  6 16 25 28 37

В этом выводе у нас есть 2 ODD числа и 4 EVEN числа, как указано в последней части кодов.

Что я хочудостижения:

Мне нужно изменить коды так, чтобы они давали ВСЕ возможные результаты из того, что было указано, вместо одного случайного вывода.В идеале я хотел бы записать этот новый вывод в файл CSV.

Скажем, что-то вроде:

write.csv(result1, file="result1.csv")

Как я могу это сделать?

1 Ответ

0 голосов
/ 02 февраля 2019

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

#First get all possible combinations based on the names
#For example, from list 1 we want to select 2 element, from list 2 only 1 and so on
#simplify is kept FALSE for the same purpose so that we get a list as outcome
#and those elements are treated as a group and not individual elements
all_combn <- sapply(seq_along(foo) ,function(x) combn(foo[[x]], 
                     as.numeric(names(foo[x])), simplify = FALSE))

#Now create a dataframe where each row is one possible outcome
expanded <- expand.grid(all_combn)

#however, the problem is where there are more than 1 items to select it has 
#columns as list, so we need to expand those list elements to separate columns
all_values <- t(apply(expanded, 1, unlist))

#Now select rows where our condition is satisfied
final <- all_values[apply(all_values, 1, countOdds) == 2, ]
final

#       Var11 Var12 Var2 Var31 Var32 Var4
#  [1,]     2     6   16    21    28   31
#  [2,]     2     8   16    21    28   31
#  [3,]     6     8   16    21    28   31
#  [4,]     2     6   16    25    28   31
#  [5,]     2     8   16    25    28   31
#  [6,]     6     8   16    25    28   31
#  [7,]     2     6   16    28    29   31
#  [8,]     2     8   16    28    29   31
#  [9,]     6     8   16    28    29   31
# [10,]     2     6   16    21    28   33
#.....

Теперь вы можете записать это final в CSV, используя write.csv или любой другойдругой метод.

...