Из этого фрейма данных df
group from to weight
1 1 Joey Joey 1
2 1 Joey Deedee 1
3 1 Deedee Joey 1
4 1 Deedee Deedee 1
5 2 Johnny Johnny 1
6 2 Johnny Tommy 1
7 2 Tommy Johnny 1
8 2 Tommy Tommy 1
что можно создать вот так
df <- structure(list(group = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), from =
structure(c(2L, 2L, 1L, 1L, 3L, 3L, 4L, 4L), .Label = c("Deedee",
"Joey", "Johnny", "Tommy"), class = "factor"), to = structure(c(2L, 1L,
2L, 1L, 3L, 4L, 3L, 4L), .Label = c("Deedee", "Joey", "Johnny",
"Tommy"), class = "factor"), weight = c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L)), .Names = c("group", "from", "to", "weight"), class = "data.frame",
row.names = c(NA, -8L))
разреженную матрицу mat
можно получить с помощью пакета Matrix
mat <- sparseMatrix(i = as.numeric(df$from), j = as.numeric(df$to), x =
df$weight, dimnames = list(levels(df$from), levels(df$to)))
который выглядит так:
4 x 4 sparse Matrix of class "dgCMatrix"
Deedee Joey Johnny Tommy
Deedee 1 1 . .
Joey 1 1 . .
Johnny . . 1 1
Tommy . . 1 1
.
Как создать разреженную подматрицу с помощью df$group
без уменьшения размера исходной матрицы?
Результат должен выглядеть так:
4 x 4 sparse Matrix of class "dgCMatrix"
Deedee Joey Johnny Tommy
Deedee 1 1 . .
Joey 1 1 . .
Johnny . . . .
Tommy . . . .
Первая идея
Если я подмножу фрейм данных и создам подматрицу
df1 <- subset(df, group == 1)
mat1 <- sparseMatrix(i = as.numeric(df1 $from), j = as.numeric(df1 $to),
x = df1 $weight)
результатом является разреженная матрица 2 x 2. Это не вариант. Помимо «потери двух узлов», мне также пришлось бы фильтровать уровни факторов, которые будут использоваться в качестве имен измерений.
Хитрость может заключаться в том, чтобы не потерять факторы при создании матрицы.
Вторая идея
Если я установлю df$weight
на ноль для группы, которая мне не интересна, и создам подматрицу
df2 <- df
df2[df2$group == 2, 4] <- 0
mat2 <- sparseMatrix(i = as.numeric(df2$from), j = as.numeric(df2$to), x
= df2$weight, dimnames = list(levels(df$from), levels(df$to)))
матрица имеет правильную размерность, и я могу легко использовать уровни факторов в качестве имен измерений, но теперь матрица содержит нули:
4 x 4 sparse Matrix of class "dgCMatrix"
Deedee Joey Johnny Tommy
Deedee 1 1 . .
Joey 1 1 . .
Johnny . . 0 0
Tommy . . 0 0
Это также не вариант, потому что нормализация строк создает NaN
s, и у меня возникают проблемы, когда я преобразовываю матрицу в график и выполняю сетевой анализ.
Здесь может быть хитрость в удалении нулей из разреженной матрицы? Но как?
В любом случае решение должно быть максимально эффективным, поскольку матрицы получаются очень большими.