Один из способов - использовать 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