studio resueltos means jerarquico jerarquica ejercicios ejemplo cluster clasificacion bietapico analisis agrupamiento r csv matrix distance

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