Преобразование и сохранение матрицы расстояния в конкретном формате
Я получил матрицу расстояний со следующими шагами:
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
Ответы
Ответ 1
Это вполне выполнимо, используя базовые функции 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")
.
Ответ 2
вы можете сделать это, объединив расплав из пакета reshape, upper.tri и т.д.:
> 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