Расширение / преобразование разреженной матрицы в большую разреженную матрицу

Я знаю, что название этого вопроса сбивает с толку, если не неправильно. Извините за это, позвольте мне объяснить, что я пытаюсь сделать:

# I have a population of individuals:
population <- c("Adam", "Bob", "Chris", "Doug", "Emily", "Frank", "George","Harry", "Isaac", "Jim", "Kyle", "Louis")
population_size <- length(population) # this is 12

# I then draw a sample from this population
mysample_size <- 5
mysample <- sample(population,mysample_size, replace=FALSE)

# I then simulate a network among the people in the sample
frn <- matrix(rbinom(mysample_size*mysample_size, 1, 0.4),nrow=n)
x[x<=0] <- 0
x[x>0] <- 1
rownames(frn) <- mysample 
colnames(frn) <- mysample

* Теперь я хотел бы перенести значения из frn в матрицу, которая включает в себя все члены из исходного населения, то есть матрицу 12 на 12. Значения в этой матрице будут получены только из матрицы 5*5.

Я не знаю, как сгенерировать матрицу внизу из матрицы сверху.

Я думал о разных способах (например, использование iGraph и продвижение через крайние списки) или о запуске циклов, но на самом деле не получил ни одной альтернативы для запуска. Может быть, это важно знать в качестве фона: мои фактические матрицы намного больше, чем эта, и мне нужно многократно запускать эту операцию, поэтому было бы полезно эффективное решение. Большое спасибо за вашу помощь.

3 ответа

Решение

Самое лучшее решение: ind = match(mysample,population) дает номера индексов строк и столбцов, соответствующих выборке, поэтому обновите матрицу сети населения popn при выполнении popn[ind,ind] = frn, Готово.

# create an empty matrix with NAs. You may have the full matrix already.
full_matrix <- matrix(rep(NA, population_size*population_size), nrow=population_size)
rownames(full_matrix) <- colnames(full_matrix) <- population
frn <- matrix(rbinom(mysample_size*mysample_size, 1, 0.4), nrow = mysample_size)
rownames(frn) <- colnames(frn) <- mysample
# Find the locations where they match
tmp <- match(rownames(frn), rownames(full_matrix))
tmp2 <- match(colnames(frn), colnames(full_matrix))

# do a merge
full_matrix[tmp,tmp2] <- frn

Вы могли бы использовать... разреженную матрицу.

library(Matrix)
# Make sure the columns match
population <- c( mysample, setdiff(population, mysample) )
ij <- which( frn != 0, arr.ind=TRUE )
m <- sparseMatrix( 
  i = ij[,1], j=ij[,2], 
  x = 1,  # or frn[ij]
  dim = length(population)*c(1,1), 
  dimnames = list(population, population) 
)
m
Другие вопросы по тегам