Преобразование и сохранение матрицы расстояний в определенный формат - PullRequest
17 голосов
/ 28 апреля 2011

Я получил матрицу расстояний со следующими шагами:

x <- read.table(textConnection('
     t0 t1 t2
 aaa  0  1  0
 bbb  1  0  1
 ccc  1  1  1
 ddd  1  1  0
 ' ), header=TRUE)

Как таковой x - это фрейм данных с заголовками столбцов и строк

    t0 t1 t2
aaa  0  1  0
bbb  1  0  1
ccc  1  1  1
ddd  1  1  0

require(vegan)
d <- vegdist(x, method="jaccard")

Матрица расстояний dполучается следующим образом:

          aaa       bbb       ccc
bbb 1.0000000                    
ccc 0.6666667 0.3333333          
ddd 0.5000000 0.6666667 0.3333333

Набрав str (d), я обнаружил, что это не обычная таблица или формат csv.

Class 'dist'  atomic [1:6] 1 0.667 0.5 0.333 0.667 ...
  ..- attr(*, "Size")= int 4
  ..- attr(*, "Labels")= chr [1:4] "aaa" "bbb" "ccc" "ddd"
  ..- attr(*, "Diag")= logi FALSE
  ..- attr(*, "Upper")= logi FALSE
  ..- attr(*, "method")= chr "jaccard"
  ..- attr(*, "call")= language vegdist(x = a, method = "jaccard")

Я хочу преобразовать матрицу расстояний в3 столбца с новыми заголовками и сохраните его как CSV-файл следующим образом:

c1  c2  distance
aaa bbb 1.000
aaa ccc 0.6666667
aaa ddd 0.5
bbb ccc 0.3333333
bbb ddd 0.6666667
ccc ddd 0.3333333

Ответы [ 2 ]

27 голосов
/ 28 апреля 2011

Это вполне выполнимо при использовании базовых функций R. Сначала мы хотим, чтобы все попарные комбинации строк заполняли столбцы c1 и c2 в результирующем объекте. Последний столбец distance достигается простым преобразованием объекта "dist" d в числовой вектор (это уже вектор, но другого класса).

Первый шаг выполняется с помощью combn(rownames(x), 2), а второй - с помощью as.numeric(d):

m <- data.frame(t(combn(rownames(x),2)), as.numeric(d))
names(m) <- c("c1", "c2", "distance")

Что дает:

> m
   c1  c2  distance
1 aaa bbb 1.0000000
2 aaa ccc 0.6666667
3 aaa ddd 0.5000000
4 bbb ccc 0.3333333
5 bbb ddd 0.6666667
6 ccc ddd 0.3333333

Чтобы сохранить как файл CSV, write.csv(m, file = "filename.csv").

20 голосов
/ 28 апреля 2011

Вы можете сделать это, комбинируя расплав с измененной формы, верхний и т. Д.:

> library(reshape)
> m <- as.matrix(d)
> m
          aaa       bbb       ccc       ddd
aaa 0.0000000 1.0000000 0.6666667 0.5000000
bbb 1.0000000 0.0000000 0.3333333 0.6666667
ccc 0.6666667 0.3333333 0.0000000 0.3333333
ddd 0.5000000 0.6666667 0.3333333 0.0000000
> m2 <- melt(m)[melt(upper.tri(m))$value,]
> names(m2) <- c("c1", "c2", "distance")
> m2
    c1  c2  distance
5  aaa bbb 1.0000000
9  aaa ccc 0.6666667
10 bbb ccc 0.3333333
13 aaa ddd 0.5000000
14 bbb ddd 0.6666667
15 ccc ddd 0.3333333
...