Bogdan Taranta

Bogdan Taranta Business Solutions
Manager

Temat: macierz do postaci kolumna, wiersza, wartość

Mam piątkowe zaćmienie umysłu, jaki był sprytny sposób na przekształcenie macierzy do postaci kolumna, wiersz, wartość? Jeśli nie mam halucynacji, była ku temu odpowiednia funkcja... coś chyba jak expand... explose... :)

Dziękuję za pomoc!
b.
Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: macierz do postaci kolumna, wiersza, wartość

expand.grid?

Jak 'm' nie ma nazw kolumn wierszy, to mozna np tak:

m <- matrix(1:24, 8, 3)
d <- expand.grid(lapply(dim(m), seq))
d$value <- as.vector(m)

albo tak

as.data.frame(as.table(m))

tylko R sam nazywa wiersze/kolumny kolejnymi literami alfabetu.

Jeżeli 'm' ma nazwy kolumn/wierszy (dimnames), to np:

m <- matrix(1:24, 8, 3)
dimnames(m) <- list(letters[1:8], LETTERS[1:3])
d <- expand.grid(dimnames(m))
d$value <- as.vector(m)


Na pewno jest pare innych sposobow...Michał Bojanowski edytował(a) ten post dnia 10.09.10 o godzinie 17:51
Bogdan Taranta

Bogdan Taranta Business Solutions
Manager

Temat: macierz do postaci kolumna, wiersza, wartość

Właśnie o expand.grid mi chodziło:


cbind(expand.grid(list(1:dim(MAT)[1],1:dim(MAT)[2])), as.vector(MAT))


Dziękuję!Bogdan Taranta edytował(a) ten post dnia 10.09.10 o godzinie 13:23
Wojciech Sobala

Wojciech Sobala Redaktor
statystyczny,
biostatystyk,
Instytut Medycyny
Pr...

Temat: macierz do postaci kolumna, wiersza, wartość

Inne rozwiązanie:

cbind(1:nrow(m),rep(1:ncol(m),each=nrow(m)),as.numeric(m))
Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: macierz do postaci kolumna, wiersza, wartość

Anowłaśnie.

Co prawda, zaletą expand.grid w

m <- matrix(1:24, 8, 3)

d <- cbind( expand.grid(lapply(dim(m), seq)), value=as.vector(m) )

# albo, gdy sa 'dimnames'
d <- cbind( expand.grid(dimnames(m)), as.vector(m) )

jest to, że będzie działać jak 'm' na wiecej niz 2 wymiary (jest array-em a nie macierzą), np.:

a <- array(1:8, dim=c(2,2,2))
cbind( expand.grid(lapply(dim(a), seq)), value=as.vector(a))
Michał Bojanowski edytował(a) ten post dnia 10.09.10 o godzinie 17:52
Wojciech Sobala

Wojciech Sobala Redaktor
statystyczny,
biostatystyk,
Instytut Medycyny
Pr...

Temat: macierz do postaci kolumna, wiersza, wartość

Uogólnienie dla innej metody:

cbind(sapply(1:length(dim(m)),function(x) rep(1:dim(m)[x],each=cumprod(c(1,dim(m))[x]),length=prod(dim(m)))),as.vector(m))

Działa w dowolej ilości wymiarów ale kod nie jest zbyt czytelny.
Ciekawe jak wyglądałoby porównanie szybkości działania, bo jeżeli jest wolniejsze od expand.grid to tylko sztuka dla sztuki.



Wyślij zaproszenie do