сумма строк для матрицы по указанному количеству столбцов в R

Я пытаюсь получить сумму столбцов в матрице в R для определенной строки. Однако я не хочу, чтобы суммировалась вся строка, а только указанное количество столбцов, то есть в этом случае весь столбец выше диагонали. Я пробовал функции sum и rowSums, но они либо дают странные результаты, либо выдают сообщение об ошибке. Чтобы проиллюстрировать это, см. Пример кода для матрицы 8x8 ниже. Для первой строки мне нужна сумма строки, кроме элемента [1,1], для второй строки - сумма, кроме элементов [2,1] и [2,2] и т. Д.

m1 <- matrix(c(0.2834803,0.6398198,0.0766999,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,
               0.0000000,0.1101746,0.6354086,0.2544168,0.0000000,0.0000000,0.0000000,0.0000000,
               0.0000000,0.0000000,0.0548145,0.9451855,0.0000000,0.0000000,0.0000000,0.0000000,
               0.0000000,0.0000000,0.0000000,0.3614786,0.6385214,0.0000000,0.0000000,0.0000000,
               0.0000000,0.0000000,0.0000000,0.0000000,0.5594658,0.4405342,0.0000000,0.0000000,
               0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.7490395,0.2509605,0.0000000,
               0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.5834363,0.4165637,
          0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,1.0000000),
             8, 8, byrow = TRUE, 
             dimnames = list(c("iAAA", "iAA", "iA", "iBBB", "iBB", "iB", "iCCC", "iD"),
                  c("iAAA_p", "iAA_p", "iA_p", "iBBB_p", "iBB_p", "iB_p", "iCCC_p", "iD_p")))

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

rowSums(m1[1, 2:8]) --> Error in rowSums(m1[1, 2:8]) : 
  'x' must be an array of at least two dimensions

Альтернативно:

sum(m1[1,2]:m1[1,8]) --> wrong result of 0.6398198 (which is item [1,2])

Насколько я понимаю, rowSums нужен массив, а не вектор (хотя не уверен, почему). Но я не понимаю, почему второй способ использования суммы не работает. В идеале есть способ суммировать только все столбцы в строке, которые лежат выше диагонали.

Большое спасибо!


person Triamus    schedule 25.06.2013    source источник


Ответы (1)


Проблема в том, что вы не передаете массив rowSums:

class(m1[1,2:8])
# [1] "numeric"

Это числовой вектор. Используйте более одной строки, и она будет работать нормально:

class(m1[1:2,2:8])
# [1] "matrix"

rowSums(m1[1:2,2:8])
#     iAAA       iAA 
#0.7165197 1.0000000 

Если вы хотите суммировать все столбцы, расположенные над диагональю, вы можете использовать lower.tri, чтобы установить для всех элементов ниже диагонали значение 0 (или, возможно, NA), а затем использовать rowSums. Если вы не хотите включать сами диагональные элементы, вы можете установить diag = TRUE (спасибо @Fabio за указание на это):

m1[lower.tri(m1 , diag = TRUE)] <- 0
rowSums(m1)
#     iAAA       iAA        iA      iBBB       iBB        iB      iCCC        iD 
#0.7165197 0.8898254 0.9451855 0.6385214 0.4405342 0.2509605 0.4165637 0.0000000 

#  With 'NA'
m1[lower.tri(m1)] <- NA
rowSums(m1,na.rm=T)
#     iAAA       iAA        iA      iBBB       iBB        iB      iCCC        iD 
#0.7165197 0.8898254 0.9451855 0.6385214 0.4405342 0.2509605 0.4165637 0.0000000 
person Simon O'Hanlon    schedule 25.06.2013
comment
Ух ты! Не знал lower.tri! - person Fabio Marroni; 25.06.2013
comment
@ SimonO101: Спасибо за быстрый ответ! Дело в том, что мне нужны суммы только по конкретным строкам, а не по всему треугольнику. - person Triamus; 25.06.2013
comment
@Triam, затем rowSums(m1[ c(1,2,6) , ] ) для rowSums первой, второй и шестой строк, например. Я действительно рекомендую вам прочитать несколько базовых руководств по подмножеству. См. ?`[` - person Simon O'Hanlon; 25.06.2013
comment
@Fabio Marroni: Хорошее решение! Я не упомянул здесь то, что мне также нужны значения из нижнего треугольника для других матриц, поэтому, думаю, мне придется сделать это за 2 шага. Чтобы дать вам контекст, это матрица изменения рейтинга / перехода рейтинга / миграции рейтинга, используемая в кредитной аналитике. Иногда меня интересуют как повышение, так и понижение, поэтому мне нужны оба треугольника. Большое спасибо! Это помогает. - person Triamus; 25.06.2013
comment
@both: извините, я новичок в стеке. Могу ли я как-то проголосовать за ответы, т.е. что они разрешили мой вопрос хорошо? Спасибо! - person Triamus; 25.06.2013
comment
@Triam: да, вы можете, но я думаю, вам нужно сначала 15 повторов. Вы можете принять ответы, нажав зеленую галочку рядом с выбранным вами ответом (что дает вам +2 репутации). Вы получаете репутацию, когда кто-то голосует за ваши вопросы (+5) или отвечает (+10). Добро пожаловать в SO. - person Simon O'Hanlon; 25.06.2013
comment
@ SimonO101: Я действительно рекомендую вам прочитать несколько базовых руководств по подмножеству - ›Я пытаюсь. Довольно новичок в R. Спасибо за подсказку! - person Triamus; 25.06.2013