2016-08-21 2 views
0

Hye indice,similarité

Je voudrais calculer un indice de similarité, afin d'obtenir une lorsque des lignes ar simialr et -1 quand ils ne sont pas.

dataR<- read.table(text=' 
    echant espece 
    ech1 esp1 
    ech2 esp2 
    ech3 esp2 
    ech4 esp3 
    ech5 esp3 
    ech6 esp4 
    ech7 esp4', header=TRUE) 

Je voudrais obtenir une matrice comme celle (ou NA sur le diag, il ne compte pas vraiment) enter image description here

Eh bien, j'ai essayé paquet proxy avec fonction Simil

library(proxy)  
trst<-read.table("Rtest_simil.csv",header=T,sep=",",dec=".") 
    is.numeric(trst[,2]) 
    as.numeric(trst[,2]) #the column "espece" becomes numeric 
    sim<-simil(trst,diag=TRUE) 

Mais les résultats ne sont pas exactement ce que je voulais. 1) La similarité entre ech 2 et 3 par exemple est de 0,5 et la diagonale est de 0; 2) les étiquettes de ech sont perdues 3) ... de plus, je ne peux pas l'enregistrer dans un format .csv.

enter image description here

Est-ce que quelqu'un a un conseil? merci beaucoup!

Répondre

1

Il y a sans doute des moyens plus compact pour le faire:

library(tidyr) 
same <- function(x) { ifelse(is.na(x), -1, 1) } 
spread(dataR, espece, espece) %>% 
    mutate_at(vars(-echant), funs(same)) 
## echant esp1 esp2 esp3 esp4 
## 1 ech1 1 -1 -1 -1 
## 2 ech2 -1 1 -1 -1 
## 3 ech3 -1 1 -1 -1 
## 4 ech4 -1 -1 1 -1 
## 5 ech5 -1 -1 1 -1 
## 6 ech6 -1 -1 -1 1 
## 7 ech7 -1 -1 -1 1 
+0

Merci beaucoup, je dois améliorer ProGaming dans R ... – catindri

2

La matrice décrite dans le poste peut être obtenu avec:

same.mat <- outer(dataR$espece, dataR$espece, "==") * 2 - 1 

Pour attribuer les noms aux colonnes et de lignes que décrit dans le post, on peut utiliser des noms de famille et colnames.

rownames(same.mat) <- colnames(same.mat) <- dataR$echant 
> same.mat 
#  ech1 ech2 ech3 ech4 ech5 ech6 ech7 
#ech1 1 -1 -1 -1 -1 -1 -1 
#ech2 -1 1 1 -1 -1 -1 -1 
#ech3 -1 1 1 -1 -1 -1 -1 
#ech4 -1 -1 -1 1 1 -1 -1 
#ech5 -1 -1 -1 1 1 -1 -1 
#ech6 -1 -1 -1 -1 -1 1 1 
#ech7 -1 -1 -1 -1 -1 1 1 

Une autre approche pourrait être:

same.mat <- (as.matrix(dist(as.numeric(dataR$espece)))==0)*2 - 1 
rownames(same.mat) <- colnames(same.mat) <- dataR$echant 
+0

Merci, ça marche aussi – catindri