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

问题描述 投票:1回答:1

我在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数的混合。

我怎样才能做到这一点?

r random
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.