2013-08-08 3 views
4

У меня есть матрица данных одинаковых строк и столбцов. Я хочу извлечь только верхний или нижний треугольник.Извлечь один треугольник корреляционной матрицы с атрибутами

x<-data.frame(matrix(1:25,nrow=5)) 
colnames(x)<-LETTERS[1:5] 
rownames(x)<-LETTERS[1:5] 

x[upper.tri(x,diag=F)] 

Из этого результата невозможно указать, какая комбинация столбца и строки имела значение. Итак, я хотел бы иметь атрибуты строки и столбца в результатах. Что-то вроде этого:

Col Row Val 
B A 6 
C A 11 
C B 12 
... 

Мне нужно сделать это для большой корреляционной матрицы. Спасибо.

+0

был один из приведенных ниже решений полезные? Если ответ действительно решает вашу проблему, вы можете * рассмотреть * выдержку и/или пометить ее как принятую, чтобы показать, что на вопрос был дан ответ, отметив небольшую зеленую галочку рядом с подходящим ответом. Вы ** не обязаны делать это, но это помогает уберечь сайт от оставшихся без ответа вопросов и вознаграждает тех, кто тратит время на решение вашей проблемы. –

ответ

3

Во-первых, чтобы сделать вещи однозначна, я меняю

colnames(x) <- LETTERS[6:10] 

Использование expand.grid получить строк и столбцов, имена, как это

rowCol <- expand.grid(rownames(x), colnames(x)) 

Чтобы получить правильные строки из этого кадра данных, возьмите

labs <- rowCol[as.vector(upper.tri(x,diag=F)),] 
df <- cbind(labs, x[upper.tri(x,diag=F)]) 
colnames(df) <- c("Row","Col","Val") 
df[,c(2,1,3)] 
## Col Row Val 
## 6 G A 6 
## 11 H A 11 
## ... 
1

... это может быть решением

nam <-apply(ind, 2, function(y, x) rownames(x)[c(y)], x=x) 
cbind(nam, x[upper.tri(x,diag=F)]) 

НТН

+0

Спасибо. Я только нашел решение здесь. http://stackoverflow.com/questions/7074246/show-correlations-as-an-ordered-list-not-as-a-large-matrix – rmf

4

Я бы просто использовать which с arr.ind = TRUE, как это:

ind <- which(upper.tri(x,diag=F) , arr.ind = TRUE) 

data.frame(col = dimnames(x)[[2]][ind[,2]] , 
      row = dimnames(x)[[1]][ind[,1]] , 
      val = x[ ind ]) 

    col row val 
1 B A 6 
2 C A 11 
3 C B 12 
4 D A 16 
5 D B 17 
6 D C 18 
7 E A 21 
8 E B 22 
9 E C 23 
10 E D 24 
0

Нижний треугольник определяется с выражением «индекс столбца не более, чем индекс строки ". Этот код дает нижний треугольник (или верхний, переключая оператор>) значение 0. Используйте «» вместо 0, чтобы сохранить треугольник.

x[!(col(x) > index(x))] <- 0 

Для получения данных установлен как в исходном посте я хотел бы использовать reshape2 :: плавиться и dplyr: :(фильтр, выберите) функции.

Сначала создайте переменную id, чтобы расплавиться.

x$id <- rownames(x) 

Затем

melt(x, id = "id") %>% 
filter(value > 0) %>% 
    select(Col = variable, Row = id, Val = value) 

    Col Row Val 
1 B A 6 
2 C A 11 
3 C B 12 
4 D A 16 
5 D B 17 
6 D C 18 
7 E A 21 
8 E B 22 
9 E C 23 
10 E D 24 
Смежные вопросы