如何使我现有的R代码输出特定数量的奇数和偶数?

时间:2018-09-08 10:37:00

标签: r random

我在R中运行以下代码。根据我从每个random中选择数字的频率,它基本上输出6个list数字。

foo <- list(
  c(1,2,3,4,5,6,7,8,9,10), 
  c(11,12,13,14,15,16,17,18,19,20),
  c(21,22,23,24,25,26,27,28,29,30), 
  c(31,32,33,34,35,36,37,38,39,40) 
)

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

list2<- unlist(sapply(seq_along(foo), function(x) sample(foo[[x]], names(foo[x]))))

sort(list2)

因此,以上代码将输出6个random数字(第1个列表中的3个,第2个列表中的2个,第3个列表中的1个,第4个列表中的一个)。

我还希望能够在最终输出中选择odd号和even号的数量。

假设我想保留现有代码,但我希望输出是4个even数字和2个odd数字的组合。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

可能有很多选择,但是最简单的方法是使用无限循环。但是,在循环之前,您需要再使用2个函数来计算赔率:

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

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

然后循环是:

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

通常,它 连续 会产生不同的答案,但是只有找到2个奇数和4个偶数时,它才会停止。


整个代码为:

foo <- list(
  c(1,2,3,4,5,6,7,8,9,10), 
  c(11,12,13,14,15,16,17,18,19,20),
  c(21,22,23,24,25,26,27,28,29,30), 
  c(31,32,33,34,35,36,37,38,39,40) 
)

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


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

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



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

sort(list2)

结果是:

4 6 7 11 12 30

6 9 10 16 17 24

8 9 10 11 14 24