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

È stato utile?

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 ....

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top