resueltos - cluster jerarquico
Convierte y guarda matriz de distancia a un formato especĂfico (2)
Obtuve una matriz de distancia con los siguientes pasos:
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)
Como tal, x
es un marco de datos con encabezados de columna y fila
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")
La matriz de distancia d se obtiene de la siguiente manera:
aaa bbb ccc
bbb 1.0000000
ccc 0.6666667 0.3333333
ddd 0.5000000 0.6666667 0.3333333
Al escribir str (d), encontré que no es una tabla ordinaria ni formato 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")
Quiero ocultar la matriz de distancia a 3 columnas con nuevos encabezados y guardarla como un archivo csv de la siguiente manera:
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
Esto es bastante factible usando las funciones base de R. Primero queremos que todas las combinaciones de pares de las filas llenen las columnas c1
y c2
en el objeto resultante. La distance
final de la columna se logra simplemente convirtiendo el objeto "dist"
d
en un vector numérico (ya es un vector pero de una clase diferente).
El primer paso se realiza usando combn(rownames(x), 2)
y el segundo paso a través de as.numeric(d)
:
m <- data.frame(t(combn(rownames(x),2)), as.numeric(d))
names(m) <- c("c1", "c2", "distance")
Lo que da:
> 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
Para guardar como un archivo CSV, write.csv(m, file = "filename.csv")
.
puedes hacer esto combinando derretir desde el paquete de remodelación, upper.tri, etc .:
> 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