Calcola la correlazione aggregando le colonne del frame di dati
-
27-10-2019 - |
Domanda
Ho il seguente frame di dati:
y <- data.frame(group = letters[1:5], a = rnorm(5) , b = rnorm(5), c = rnorm(5), d = rnorm(5) )
Come ottenere un frame di dati che mi dà la correlazione tra le colonne A, B e C, D per ogni riga?
qualcosa di simile a: sapply(y, function(x) {cor(x[2:3],x[4:5])})
Grazie, s
Soluzione
Potresti usare apply
> apply(y[,-1],1,function(x) cor(x[1:2],x[3:4]))
[1] -1 -1 1 -1 1
O ddply
(Anche se questo potrebbe essere eccessivo, e se due righe hanno lo stesso group
Farà la correlazione delle colonne A&B e C&D per entrambe queste righe):
> 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
Altri suggerimenti
Puoi usare apply
Per applicare una funzione a ciascuna riga (o colonna) di una matrice, array o data.
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] )
)
(Con solo 2 osservazioni, la correlazione può essere solo +1 o -1.)
Sei quasi lì: devi solo usare apply
invece di sapply
, e rimuovere colonne non necessarie.
apply(y[-1], 1, function(x) cor(x[1:2], x[3:4])
Naturalmente, la correlazione tra due vettori di lunghezza 2 non è molto istruttiva ....