2011-06-13 5 views
1

J'ai dataframe comme suit:pearson corrélation

x <- data.frame(Name=c("a", "b","c", "d", "e"),A=(1:5), B=(2:6), C=(7:11), D=c(1,1,1,1,1)) 

Je veux obtenir un dataframe y compris tous les coefficients de pearson d'un contre b, un vs c, un vs d, un vs e, b vs un , b vs c, b vs d, b vs e .... etc (à l'exclusion des auto-comparaisons, c'est-à-dire aa, bb, etc).

En mots d'ordre, je veux changer la trame de données

  A B C D 
a 1 2 7 1 
b 2 3 8 1 
c 3 4 9 1 
d 4 5 10 1 
e 5 6 11 1 

à un résultat comme celui-ci dataframe

a b 0.989143436 
a c 0.963282002 
a d 0.93048421 
a e 0.89585579 
b c 0.9922798 
b d 0.974216034 
b e 0.951427811 
c d 0.994675789 
c e 0.982264673 
d e 0.996357429 

suivant Pls demander de bien vouloir moyen efficace de le faire.

EDIT

Merci pour l'aide de Michaelv2.

Basé sur le code proposé, je trouve les résultats sont les suivants:

X1 X2 value 
1 A A  1 
2 B A  1 
3 C A  1 
4 D A NA 
5 A B  1 
6 B B  1 
7 C B  1 
8 D B NA 
9 A C  1 
10 B C  1 
11 C C  1 
12 D C NA 
13 A D NA 
14 B D NA 
15 C D NA 
16 D D  1 

Le message d'erreur est " message d'avertissement: Dans cor (x [2: 5], method = "pearson"): l'écart-type est zéro "

Il me semble que j'ai peut-être mal utilisé le code, pourriez-vous nous donner des instructions pour résoudre ce problème? Je vous remercie.

Répondre

3

Vous pouvez utiliser quelque chose comme ce qui suit:

require(reshape) 

y <- as.data.frame(t(x[2:5]), stringsAsFactors=FALSE) 
colnames(y) <- x[[1]] 

yrho <- melt(cor(y, method="pearson")) 
subset(yrho, yrho$X1 != yrho$X2) 

Résultat:

X1 X2  value 
2 b a 0.9891434 
3 c a 0.9632820 
4 d a 0.9304842 
5 e a 0.8958558 
6 a b 0.9891434 
8 c b 0.9922798 
9 d b 0.9742160 
10 e b 0.9514278 
11 a c 0.9632820 
12 b c 0.9922798 
14 d c 0.9946758 
15 e c 0.9822647 
16 a d 0.9304842 
17 b d 0.9742160 
18 c d 0.9946758 
20 e d 0.9963574 
21 a e 0.8958558 
22 b e 0.9514278 
23 c e 0.9822647 
24 d e 0.9963574 
+0

Eh bien, les étiquettes de ligne peut-être des étiquettes de ligne, il n'y a pas besoin de les omettre alors. De plus, l'OP voulait des corrélations entre les rangées de lignes, pas de colonnes-colonnes (mais un seul 't' fera l'affaire). – mbq

+0

Techniquement, j'ai omis la première colonne de la trame de données (un caractère ou un vecteur de facteur, selon vos paramètres), pas les étiquettes de ligne, mais vous avez raison sur les corrélations entre les lignes. Merci d'avoir fait remarquer cela. – michaelv2

Questions connexes