У меня есть что-то вроде базового c вопроса, так как я делаю предварительное кодирование в рамках подготовки к диссертации. У меня есть некоторый опыт работы с R, но я все еще немного новичок. Я просмотрел inte rnet и пока не нашел хорошего ответа. Надеюсь, что кто-то может помочь улучшить мой код и сделать его более эффективным.
Я пытаюсь создать серию из 4 случайно нарисованных сетей 5х5, которые слегка меняются в каждый момент времени. Для этого я создаю вектор из 25 случайно нарисованных (prob = .5) 0 и 1, а затем создаю матрицу 5x5 из вектора. Матрица будет служить матрицей смежности для каждой сети. Создать исходную матрицу довольно просто:
a <- rbinom(25, 1, .5)
matrix_a <- matrix(a, ncol = 5, nrow = 5)
Эта матрица будет служить моей сетью в момент времени 1. Для моментов времени 2-4 я хочу, чтобы 5 случайно выбранных ячеек перевернулись, поэтому 0 становится a 1, а a 1 становится 0. Для тех, кто не знаком с сетями, это означает, что в пяти случаях ребра изменяются и добавляются (если раньше их не было) или удаляются (если были).
Я понял, как это сделать, - сначала выбрать случайным образом 5 элементов из вектора b:
spot <- sample(25,5)
Это даст мне вектор из 5 элементов, представляющих произвольно нарисованная позиция от 1 до 25. Затем я хочу изменить эти 5 нулей или единиц на их противоположные (чтобы ноль стал единицей, и наоборот), а затем я могу вставить их обратно в элемент с 25 векторами, и сделайте matrix_b в момент времени 2 с этого момента и повторите еще два раза. Таким образом, сети остаются довольно стабильными, но изменяются незначительно и случайным образом в моменты времени со 2 по 4.
Но вот где у меня возникают проблемы. Я хотел бы создать функцию для автоматизации изменения пяти нулей на единицы и наоборот, что, кажется, должно быть легко сделать. Пока что это лучшее, что я смог сделать:
x <- (a[spot])
y1 <- if (x[1]==0) {
x[1]+1
} else {
x[1]-1
}
y1
y2 <- if (x[2]==0) {
x[2]+1
} else {
x[2]-1
}
y2
Я проверил это, и оно меняет ноль на единицу и наоборот.
Я повторяю это еще три раза для создания y3, y4 и y5, затем создаю новый вектор из 5 элементов:
y <- c(y1,y2,y3,y4,y5)
y
Теперь я заменяю пять элементов из вектора из 25 элементов a с вектором y выше (который изменился с нуля на единицу и наоборот), чтобы создать новый вектор b:
b <- a
b[spot] <- y
matrix_b <- matrix(b, ncol = 5, nrow = 5)
Я получаю matrix_b в момент времени 2, в котором с 5 ячейками изменено с нуля на единицу или наоборот, представляя ребра, которые были добавлены или удалены.
Это будет работать, но это действительно неэффективно. Я знаю, есть способ автоматизировать использование функций? применить? - создание y1 до y5 выше. Но я искал часы, и это все еще лучшее, что я могу сделать.
Есть предложения по улучшению кода? Заранее благодарим за любую помощь, которую вы можете предложить.