11
votes

Convertir un fichier de données en un objet de classe "dist" sans calculer réellement des distances en r

J'ai un fichier de données avec des distances xxx

J'ai besoin de convertir ceci en un objet de classe "dist" mais je n'ai pas besoin de calculer une distance donc donc je canon utilise le dist ( ) fonction. Tout conseil?


0 commentaires

4 Réponses :


2
votes

? AS.Dist () devrait vous aider, bien qu'il s'attend à une matrice comme entrée.


3 commentaires

Oui c'est le problème. J'ai déjà calculé la distance en utilisant ma propre fonction. Cependant, créer des dendrogrammes ou faire une PCA, etc. Nécessite un objet de distance.


Vous devez convertir vos données.frame en matricielle à l'aide de la solution que vous avez obtenue dans Ce message puis utilisez as.dist (vous avez besoin du triangle inférieur de la matrice)


Veuillez lire attentivement la page d'aide pour comprendre l'objet de la classe de classe.



3
votes

J'ai eu un problème similaire de ne pas avoir de même temps et j'ai résolu cela comme ceci:

n <- max(table(df$site.x)) + 1  # +1,  so we have diagonal of 
res <- lapply(with(df, split(Distance, df$site.x)), function(x) c(rep(NA, n - length(x)), x))
res <- do.call("rbind", res)
res <- rbind(res, rep(NA, n))
res <- as.dist(t(res))


2 commentaires

C'est une très belle solution merci! Juste une question. Pourquoi la dernière étiquette de la ligne est-elle supprimée et existe-t-il de toute façon que cela peut être évité? Merci encore


Un problème avec cette excellente approche est que vous devez créer la matrice de distance complète pour créer l'objet "dist" . C'est un peu gaspillage et rbind () Les grands ensembles de données peuvent être lents. Comme vous avez déjà le vecteur de distances, et "dist" Les objets de classe ne sont qu'un vecteur avec des attributs, il est plus facile et plus efficace d'ajouter directement des attributs au vecteur de distances. Voir ma réponse ci-dessous pour un exemple et des détails.



15
votes

Il n'y a rien qui vous empêche de créer vous-même l'objet dist. C'est juste un vecteur de distances avec des attributs qui configurent les étiquettes, la taille, etc.

à l'aide de votre df , voilà comment xxx

Ou vous pouvez faire cela via structure () directement: xxx

celles-ci donnent: xxx < p> note : ce qui précède ne vérifie pas que les données sont dans le bon ordre. Assurez-vous que vous avez les données dans df dans le bon ordre comme vous le faites dans l'exemple; I.e. Trier par Site.x TU SITE.Y Avant d'exécuter le code I Show.


0 commentaires

1
votes

Pour les personnes qui arrivent de google ... La fonction ACAST dans la bibliothèque Reshape2 est une voie à suivre pour ce type de choses.

library(reshape2)
acast(df, site.x ~ site.y, value.var='Distance', fun.aggregate = sum, margins=FALSE)


0 commentaires