в R, как получить полную матрицу с помощью combn? - PullRequest
3 голосов
/ 08 апреля 2011

Моя проблема с удалением определенной цели выглядит следующим образом: как преобразовать комбинацию следующим образом: сначала используйте combn(letters[1:4], 2) для вычисления комбинации

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] "a"  "a"  "a"  "b"  "b"  "c" 
[2,] "b"  "c"  "d"  "c"  "d"  "d" 

используйте каждый столбец для получения другого фрейма данных:

   [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1    2    3    4   5     6

элементы получаются, например: первый элемент из первого столбца вышеуказанного кадра данных

затем Как я могу преобразовать вышеупомянутый кадр данных в матрицу, например, результат,такие вещи, как:

   a   b   c  d
a  0   1   2  3
b  1   0   4  5
c  2   4   0  6
d  3   5   6  0

элементы с одинаковыми именами col и row будут иметь нулевое значение, в то время как другие, соответствующие указанному выше значению

Ответы [ 2 ]

4 голосов
/ 08 апреля 2011

Вот один способ, который работает:

inputs <- letters[1:4]
combs <- combn(inputs, 2)
N <- seq_len(ncol(combs))
nams <- unique(as.vector(combs))
out <- matrix(ncol = length(nams), nrow = length(nams))
out[lower.tri(out)] <- N
out <- t(out)
out[lower.tri(out)] <- N
out <- t(out)
diag(out) <- 0
rownames(out) <- colnames(out) <- inputs

Что дает:

> out
  a b c d
a 0 1 2 3
b 1 0 4 5
c 2 4 0 6
d 3 5 6 0

Если бы мне пришлось много делать, я бы обернул эти вызовы функций в функцию.

Другой вариант - использовать as.matrix.dist(), чтобы выполнить преобразование для нас, вручную установив объект "dist". Используя некоторые объекты из ранее:

## Far easier
out2 <- N
class(out2) <- "dist"
attr(out2, "Labels") <- as.character(inputs)
attr(out2, "Size") <- length(inputs)
attr(out2, "Diag") <- attr(out2, "Upper") <- FALSE
out2 <- as.matrix(out2)

Что дает:

> out2
  a b c d
a 0 1 2 3
b 1 0 4 5
c 2 4 0 6
d 3 5 6 0

Опять же, я бы обернул это в функцию, если бы мне пришлось делать это более одного раза.

1 голос
/ 08 апреля 2011

Это должна быть зеркальная матрица с нулями по диагонали?

combo <- combn(letters[1:4], 2)
in.combo <- matrix(1:6, nrow = 1)
combo <- rbind(combo, in.combo)
out.combo <- matrix(rep(NA, 16), ncol = 4)
colnames(out.combo) <- letters[1:4]
rownames(out.combo) <- letters[1:4]

for(cols in 1:ncol(combo)) {
    vec1 <- combo[, cols]
    out.combo[vec1[1], vec1[2]] <- as.numeric(vec1[3])
}

> out.combo
   a  b  c  d
a NA  1  2  3
b NA NA  4  5
c NA NA NA  6
d NA NA NA NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...