Суммировать попарные строки с R? - PullRequest
2 голосов
/ 24 июля 2011

Мой ввод

 df1 <- data.frame(Row=c("row1", "row2", "row3", "row4", "row5"),
                   A=c(1,2,3,5.5,5), 
                   B=c(2,2,2,2,0.5),
                   C= c(1.5,0,0,2.1,3))

Это выглядит так:

#  Row1 1   2   1.5
#  Row2 2   2   0
#  Row3 3   2   0
#  Row4 5.5 2   2.1
#  Row5 5   0.5 3

Я хочу получить сумму всех этих пар строк с помощью следующего уравнения. Скажем, для пар Row1 и Row2: я хочу умножить запись каждого столбца и объединить их в один окончательный ответ, например -

  • Row1-Row2 ответ (1*2) + (2*2)+ (1.5 *0) = 6
  • Row1-Row3 ответ (1*3) + (2*2) + (1.5*0) = 7

Я хочу выполнить весь анализ для каждой пары строк и получить фрейм данных результата следующим образом:

row1    row2    6
row1    row3    7
row1    row4    12.65
row1    row5    10.5
row2    row3    10
row2    row4    15
row2    row5    11
row3    row4    20.5
row3    row5    16
row4    row5    34.8

Как я могу сделать это с R? Большое спасибо за комментарии.

Ответы [ 2 ]

3 голосов
/ 24 июля 2011
  1. Создайте все необходимые комбинации с помощью combn.t используется для транспонирования матрицы, как вы ожидаете, что она будет отформатирована.
  2. Используйте apply для перебора индексов, созданных на шаге 1. Обратите внимание, что мы используем отрицательную индексацию, поэтому мы не пытаемсяСуммируйте столбец Row.
  3. Свяжите два результата вместе.

`

ind <- t(combn(nrow(df1),2))
out <- apply(ind, 1, function(x) sum(df1[x[1], -1] * df1[x[2], -1]))
cbind(ind, out)

           out
[1,] 1 2  6.00
[2,] 1 3  7.00
[3,] 1 4 12.65
 .....
2 голосов
/ 24 июля 2011

Да! Это матричное умножение! : -))

Сначала просто подготовим матрицу:

m = as.matrix(df1[,2:4])
row.names(m) = df1$Row

и это операция, как легко!

m %*% t(m)

Вот и все!

Один совет - вы можете определить data.frame таким образом, и он сохранит вам команду row.names:

df1 <- data.frame(row.names=c("row1", "row2", "row3", "row4", "row5"),A=c(1,2,3,5.5,5), B=c(2,2,2,2,0.5), C= c(1.5,0,0,2.1,3))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...