2012-01-13 6 views
2

У меня есть следующий кадр данных:Расчет корреляции путем объединения столбцов кадра данных

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

Как получить кадр данных, который дает мне корреляцию между столбцами а, б и в, г для каждой строки?

что-то вроде: sapply(y, function(x) {cor(x[2:3],x[4:5])})

Спасибо, S

ответ

2

Вы можете использовать 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

Вы можете использовать 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.)

1

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

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

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