Рассчитать корреляцию путем агрегирования столбцов фрейма данных - PullRequest
2 голосов
/ 13 января 2012

У меня есть следующий фрейм данных:

y <- data.frame(group = letters[1:5], a = rnorm(5) , b = rnorm(5), c = rnorm(5), d = rnorm(5) )

Как получить фрейм данных, который дает мне корреляцию между столбцами a, b и c, d для каждой строки?

что-токак: sapply(y, function(x) {cor(x[2:3],x[4:5])})

Спасибо, S

Ответы [ 3 ]

2 голосов
/ 13 января 2012

Вы можете использовать apply

> apply(y[,-1],1,function(x) cor(x[1:2],x[3:4]))
[1] -1 -1  1 -1 1

или ddply (хотя это может быть излишним, и если две строки имеют одинаковые group, это сделает соотношение столбцов a & b и c & dобе эти строки):

> ddply(y,.(group),function(x) cor(c(x$a,x$b),c(x$c,x$d)))
  group V1
1     a -1
2     b -1
3     c  1
4     d -1
5     e  1
1 голос
/ 13 января 2012

Вы почти на месте: вам просто нужно использовать apply вместо sapply и удалить ненужные столбцы.

apply(y[-1], 1, function(x) cor(x[1:2], x[3:4])

Конечно, корреляция между двумя векторами длины 2 не существуетт очень информативно ....

1 голос
/ 13 января 2012

Вы можете использовать apply, чтобы применить функцию к каждой строке (или столбцу) матрицы, массива или data.frame.

apply(
  y[,-1], # Remove the first column, to ensure that u remains numeric
  1,      # Apply the function on each row
  function(u) cor( u[1:2], u[3:4] )
)

(При 2 наблюдениях корреляция может быть только +1 или -1.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...