#r #function #dataframe #matrix #random
#r #функция #фрейм данных #матрица #Случайный
Вопрос:
У меня есть функция генерации матрицы, которая создает нижний треугольник 1
s и верхний треугольник 0s
.
Мне было интересно, возможно ли добавить некоторый регулируемый случайный шум (из некоторого распределения, которое дает случайное 0
и 1
) к выводимой матрице, чтобы случайные 0
s случайным образом заменяли некоторые из нижних 1
s, а случайные 1
s случайным образом заменяли некоторые из верхних 0
s?
lower_mat <- function(r, c) {
m <- matrix(0, nrow=r,ncol=c)
m[lower.tri(m)] <- 1
m
}
lower_mat(5,4)
# [,1] [,2] [,3] [,4]
# [1,] 0 0 0 0
# [2,] 1 0 0 0
# [3,] 1 1 0 0
# [4,] 1 1 1 0
# [5,] 1 1 1 1
Ответ №1:
Если вы хотите предположить, что вы меняете местами с нижнего на верхний определенное количество позиций, вы могли бы сделать
swap_upper_lower <- function(m, n) {
tops <- which(upper.tri(m))
bots <- which(lower.tri(m))
stopifnot(length(bots)>=n amp;amp; length(tops)>=n)
tops <- sample(tops, n)
bots <- sample(tops, n)
vals <- m[tops]
m[tops] <- m[bots]
m[bots] <- vals
m
}
mm <- lower_mat(5,4)
swap_upper_lower(mm, 3)
Это поменяет местами 3 значения из нижнего треугольника в верхний треугольник
Если вы предпочитаете думать об этом как о замене позиций 0 и 1, вы могли бы вместо этого сделать
swap_0_1 <- function(m, n) {
ones <- which(m==1)
zers <- which(m==0)
stopifnot(length(ones)>=n amp;amp; length(zers)>=n)
ones <- sample(ones, n)
zers <- sample(zers, n)
vals <- m[ones]
m[ones] <- m[zers]
m[zers] <- vals
m
}
Обратите внимание, что это будет обрабатывать значения по диагонали иначе, чем другая функция.