Последовательность двух чисел с убывающей частотой встречаемости одного из них

Я хотел бы создать последовательность из двух чисел, чтобы число вхождений одного из чисел уменьшалось (от n_1 до 1), а для другого числа вхождения были зафиксированы на n_2.

Я искал и пытался использовать seq и rep, чтобы сделать это, но я не могу понять это.

Вот пример для c(0,1) и n_1=5, n_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=2, n_2=1:

0,0,1,0,1

person Seb    schedule 17.03.2017    source источник


Ответы (3)


Может быть, что-то вроде этого?

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
person A5C1D2H2I1M1N2O1R2T1    schedule 17.03.2017
comment
times = rbind(n_1:1, n_2) без c() должно быть достаточно - person GGamba; 17.03.2017

Альтернативный (хотя и более медленный) метод, использующий аналогичную концепцию:

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
person Mike H.    schedule 17.03.2017

Вот еще один подход с использованием верхнего треугольника матрицы:

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
person 989    schedule 17.03.2017