आर

2013-02-13 5 views
6

में आसन्नता matrices की गणना कैसे करें मेरे पास यह डेटा है। मैं आरआर

में एडजेंसी मैट्रिस की गणना करना चाहता हूं, मैं यह कैसे कर सकता हूं? वी 1, वी 2, वी 3 कॉलम हैं। वी 1 और वी 2 एनओडीईएस हैं, और डब्ल्यू 3 वी 1 से वी 2 के वजन हैं। इस डेटा में दिशा महत्वपूर्ण है। एडजेंसी मैट्रिस की गणना करने के बाद, मैं आर भाषा के साथ इन शोरियों के बीच सबसे छोटा रास्ता गणना करना चाहता हूं।

मैं यह कैसे कर सकता हूं?

 V1  V2  V3 
[1] 164885 431072 3 
[2] 164885 164885 24 
[3] 431072 431072 5 
+2

क्या आप अब तक की कोशिश की? मैं देखता हूं कि आप यहां नए हैं इसलिए शायद आपको अभी तक पता नहीं है कि स्टैक ओवरफ़्लो प्रोग्रामिंग प्रश्नों के उत्तर पाने के लिए एक जगह है जहां आप कोशिश करते हैं लेकिन ** अटक जाते हैं **। इस बिंदु पर यह स्पष्ट नहीं है कि आपने समस्या से निपटने का प्रयास किया है। मुझे लगता है कि [स्टैक ओवरफ्लो अकसर किये गए सवाल] (http://stackoverflow.com/faq) शुरू करने के लिए एक अच्छी जगह है। आर के बारे में प्रश्नों के लिए, [इस पोस्ट] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) एक जरूरी है। – SlowLearner

उत्तर

9

यह कम से कम अपना प्रारंभ होना चाहिए। सबसे आसान तरीका मैं के बारे में सोच सकता है adjacency matrix पाने के लिए reshape यह करने के लिए है और फिर एक ग्राफ के रूप में निम्नानुसार igraph का उपयोग कर निर्माण:

# load data 
df <- read.table(header=T, stringsAsFactors=F, text="  V1  V2  V3 
164885 431072 3 
164885 164885 24 
431072 431072 5") 
> df 
#  V1  V2 V3 
# 1 164885 431072 3 
# 2 164885 164885 24 
# 3 431072 431072 5 

# using reshape2's dcast to reshape the matrix and set row.names accordingly 
require(reshape2) 
m <- as.matrix(dcast(df, V1 ~ V2, value.var = "V3", fill=0))[,2:3] 
row.names(m) <- colnames(m) 

> m 
#  164885 431072 
# 164885  24  3 
# 431072  0  5 

# load igraph and construct graph 
require(igraph) 
g <- graph.adjacency(m, mode="directed", weighted=TRUE, diag=TRUE) 
> E(g)$weight # simple check 
# [1] 24 3 5 

# get adjacency 
get.adjacency(g) 

# 2 x 2 sparse Matrix of class "dgCMatrix" 
#  164885 431072 
# 164885  1  1 
# 431072  .  1 

# get shortest paths from a vertex to all other vertices 
shortest.paths(g, mode="out") # check out mode = "all" and "in" 
#  164885 431072 
# 164885  0  3 
# 431072 Inf  0 
9

यहाँ एक सरल समाधान है कि reshape() की जरूरत नहीं है है। हम आपके पास डेटा फ्रेम से सीधे एक igraph ग्राफ बनाते हैं। क्या तुम सच में निकटता मैट्रिक्स की जरूरत है, तो आप अभी भी यह get.adjacency() के माध्यम से प्राप्त कर सकते हैं:

library(igraph) 

## load data 
df <- read.table(header=T, stringsAsFactors=F, text= 
       "  V1  V2 V3 
        164885 431072 3 
        164885 164885 24 
        431072 431072 5") 

## create graph 
colnames(df) <- c("from", "to", "weight") 
g <- graph.data.frame(df) 
g 
# IGRAPH DNW- 2 3 -- 
# + attr: name (v/c), weight (e/n) 

## get shortest path lengths 
shortest.paths(g, mode="out") 
#  164885 431072 
# 164885  0  3 
# 431072 Inf  0 

## get the actual shortest path 
get.shortest.paths(g, from="164885", to="431072") 
# [[1]] 
# [1] 1 2