Один из способов заключается в использовании melt
Fn из reshape
пакета (ОБНОВЛЕНО во избежание дублирования в симметричных матриц, и сортировки конечного результата).
> mtx <- matrix(round(10*rnorm(16)),
4, 4, dimnames = list(LETTERS[1:4], LETTERS[1:4]))
> mtx[ upper.tri(mtx)] <- NA
> mtx
A B C D
A -7 NA NA NA
B 23 17 NA NA
C 6 -2 20 NA
D -23 8 15 -6
> require(reshape)
> df <- cbind(data.frame(Row = rownames(mtx)), as.data.frame(mtx))
> df.m <- melt(df, id = 'Row', variable_name = 'Col')
> df.m
Row Col value
1 A A -7
2 B A 23
3 C A 6
4 D A -23
5 A B NA
6 B B 17
7 C B -2
8 D B 8
9 A C NA
10 B C NA
11 C C 20
12 D C 15
13 A D NA
14 B D NA
15 C D NA
16 D D -6
> filt <- subset(df.m, value < 0)
> filt[order(filt$value),]
Row Col value
4 D A -23
1 A A -7
16 D D -6
7 C B -2
Конечно, вы можете отформатировать результат любым способом, например.
> cat(with(filt, paste(Row, Col, value, '\n')))
A A -7
D A -23
C B -2
D D -6
Вас интересует сортировка или обрезка? – Aaron