一个数字序列中某个数字出现次数递减的两个数字

8
我想要创建一个序列,由两个数字组成,其中一个数字的出现次数会减少(从n_1到1),而另一个数字的出现次数则固定为n_2
我一直在寻找并尝试使用seq和rep来完成它,但似乎无法解决。
以下是一个示例:c(0,1)n_1=5n_2=3
0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,1,0,1,1,1

对于 c(0,1)n_1=2n_2=1 的情况:

0,0,1,0,1
4个回答

10

也许像这样?

rep(rep(c(0, 1), n_1), times = rbind(n_1:1, n_2))
##  [1] 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1

这里是一个函数(没有任何健全性检查):

myfun <- function(vec, n1, n2) rep(rep(vec, n1), times = rbind(n1:1, n2))

myfun(c(0, 1), 2, 1)
## [1] 0 0 1 0 1

inverse.rle

另一种选择是使用 inverse.rle

y <- list(lengths = rbind(n_1:1, n_2),
          values = rep(c(0, 1), n_1))
inverse.rle(y)
##  [1] 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1

1
times = rbind(n_1:1, n_2) 不需要 c() 就可以完成。 - GGamba

4
一种类似的备选方法(虽然速度较慢):

unlist(mapply(rep,c(0,1),times=rbind(n_1:1,n_2)))
###[1] 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1

3

这里是使用矩阵上三角的另一种方法:

f_rep <- function(num1, n_1, num2, n_2){
    m <- matrix(rep(c(num1, num2), times=c(n_1+1, n_2)), n_1+n_2+1, n_1+n_2+1, byrow = T)
    t(m)[lower.tri(m,diag=FALSE)][1:sum((n_1:1)+n_2)]
}

f_rep(0, 5, 1, 3)
#[1] 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1

f_rep(2, 4, 3, 3)
#[1] 2 2 2 2 3 3 3 2 2 2 3 3 3 2 2 3 3 3 2 3 3 3

1
myf = function(x, n){
    rep(rep(x,n[1]), unlist(lapply(0:(n[1]-1), function(i) n - c(i,0))))
}
myf(c(0,1), c(5,3))
#[1] 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接