Расположить элементы в матрице в соответствии с rowSums + short 'apply' Q - PullRequest
2 голосов
/ 02 декабря 2010

Greetings,

Моя цель - создать марковскую матрицу перехода (вероятность перехода из одного состояния в другое), где часть матрицы с наибольшим трафиком занимает верхнюю левую часть.Рассмотрим следующий пример:

inputData <- c(
    c(5, 3, 1, 6, 7),
    c(9, 7, 3, 10, 11),
    c(1, 2, 3, 4, 5),
    c(2, 4, 6, 8, 10),
    c(9, 5, 2, 1, 1)
    )

MAT <- matrix(inputData, nrow = 5, ncol = 5, byrow = TRUE)
colnames(MAT) <- c("A", "B", "C", "D", "E")
rownames(MAT) <- c("A", "B", "C", "D", "E")

rowSums(MAT)

Я хочу переставить элементы этой матрицы таким образом, чтобы элементы с наибольшей суммой строк были расположены слева вверху в порядке убывания.Имеет ли это смысл?В этом случае порядок, который я ищу, будет B, D, A, E, C. Есть мысли?

В качестве отступления, вот функция, которую я написал для построения матрицы перехода.Есть ли более элегантный способ сделать это, не требующий двойной транспонирования?

TMAT <- apply(t(MAT), 2, function(X) X/sum(X))
TMAT <- t(TMAT)

Я попробовал следующее:

TMAT <- apply(MAT, 1, function(X) X/sum(X))

Но моя пользовательская функция все еще применяетсяпо столбцам массива, а не по строкам.Для проверки попробуйте:

rowSums(TMAT)
colSums(TMAT)

Суммы строк здесь должны равняться 1 ...

Заранее большое спасибо, Аарон

Ответы [ 2 ]

3 голосов
/ 02 декабря 2010

Используйте rowSums и colSums еще!
Первая проблема может быть решена с помощью простого:

MAT[order(rowSums(MAT),decreasing=T),]

Вторая с:

MAT/rep(rowSums(MAT),nrow(MAT))

этонемного странно, но становится очевидным, если вспомнить, что матрица также является вектором по столбцам.Принимая во внимание также переработку, это также может быть сделано просто:

MAT/rowSums(MAT)
1 голос
/ 02 декабря 2010

Для вашего первого запроса, это получает желаемое упорядочение по убыванию по сумме строк:

MAT[rev(order(rowSums(MAT))), ]

И это получает ваш TMAT за один шаг.Функция apply возвращает серию векторов, а основной порядок столбцов в матрицах будет транспонировать результаты, ожидаемые начинающими пользователями R.

> TMAT <- t(apply(MAT, 1, function(X) X/sum(X)) )
> rowSums(TMAT)
A B C D E 
1 1 1 1 1 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...