Распределить сумму случайным образом по столбцам - PullRequest
2 голосов
/ 14 марта 2020

Предположим, у меня есть вектор длины n. Допустим, n=3 так и вектор v=c(3,5,4).

У меня есть матрица нулей с n строками и m столбцами. Допустим, m=5

mymatrix <- matrix(rep(0, 3*5), nrow=3)

я хочу случайным образом распределить значения v по столбцам для каждой строки. Таким образом, в этом примере первая строка будет суммироваться до 3, вторая строка будет суммироваться до 5, а третья строка будет суммироваться до 4. Например, это будет одно из возможных случайных присвоений:

0   1   2   0   0
3   1   0   0   1
0   2   2   0   0

Суммы из строк 3,5,4, которые являются значениями v.

Как я могу выполнить sh это? Я думал начать с

sapply(v, function(i){sample(1:m, i, replace=TRUE)})

и go оттуда, но это дает мне список, так как каждый результат имеет разную длину, и я не уверен, как действовать дальше.

РЕДАКТИРОВАТЬ: намерение не является отрицательными числами, поэтому 0 9 1 1 -8 суммирование в 3 не будет допустимой строкой.

Ответы [ 2 ]

1 голос
/ 14 марта 2020

Может быть parts из пакета partitions - это инструмент, необходимый для вашей цели, т. Е.

library(partitions)
# define your custom function `f` to generate random combinations and positions, with row sum subject to the given value 
f <- function(k) replace(rep(0,ncol(mymatrix)),
                         sample(ncol(mymatrix),k),
                         as.data.frame.matrix(parts(k))[sample(k),sample(k,1)])

такой, что

set.seed(1)
M <- t(sapply(v, f))
> M
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    3    0    0
[2,]    1    0    0    4    0
[3,]    0    4    0    0    0
1 голос
/ 14 марта 2020

Использование purrr:

library(tibble)
library(dplyr)
library(purrr)

n <- 3
m <- 5
v <- c(3,5,4)
y <- sapply(v, function(i){sample(1:m, i, replace=TRUE)})

do_it <- function(x) {
  tmp <- tibble(
    index = x,
    cnt = 1
  ) %>% 
    group_by(index) %>% 
    summarise(cnt = sum(cnt))
  out <- rep(0, m)
  out[tmp$index] <- tmp$cnt
  return(out)
}

y %>%
  map(~do_it(.x)) %>% 
  unlist() %>% 
  matrix(nrow = 3, byrow = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...