आर

2016-03-03 11 views
5

में जुड़े घटकों को प्राप्त करना मेरे पास मूल्य 0 या 1 के साथ एक मैट्रिक्स है और मैं आसन्न 1 के समूहों की एक सूची प्राप्त करना चाहता हूं।आर

उदाहरण के लिए

, मैट्रिक्स

mat = rbind(c(1,0,0,0,0), 
      c(1,0,0,1,0), 
      c(0,0,1,0,0), 
      c(0,0,0,0,0), 
      c(1,1,1,1,1)) 

> mat 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 0 0 0 0 
[2,] 1 0 0 1 0 
[3,] 0 0 1 0 0 
[4,] 0 0 0 0 0 
[5,] 1 1 1 1 1 

निम्नलिखित 4 जुड़े घटकों लौटना चाहिए:

सी 1 = {(1,1), (2,1)}

सी 2 = { (2,4)}

सी 3 = {(3,3)}

सी 4 = {(5,1), (5,2), (5,3), (5,4); (5,5)}

क्या किसी के पास आर में तेजी से इसे कैसे करना है इसका विचार है? मेरा असली मैट्रिक्स वास्तव में 2000x2000 की तरह बड़ा है (लेकिन मुझे उम्मीद है कि कनेक्टेड घटकों की संख्या काफी कम होनी चाहिए, यानी 200)।

उत्तर

2

अद्यतन के साथ, आप अपने बाइनरी मैट्रिक्स को रास्टर ऑब्जेक्ट में बदल सकते हैं और क्लंप फ़ंक्शन का उपयोग कर सकते हैं। फिर यह आपके इच्छित इच्छित प्रारूप को वापस करने के लिए केवल डेटा प्रबंधन है। नीचे दिए गए उदाहरण:

library(igraph) 
library(raster) 

mat = rbind(c(1,0,0,0,0), 
      c(1,0,0,1,0), 
      c(0,0,1,0,0), 
      c(0,0,0,0,0), 
      c(1,1,1,1,1)) 
Rmat <- raster(mat) 
Clumps <- as.matrix(clump(Rmat, directions=4)) 

#turn the clumps into a list 
tot <- max(Clumps, na.rm=TRUE) 
res <- vector("list",tot) 
for (i in 1:max(Clumps, na.rm=TRUE)){ 
    res[i] <- list(which(Clumps == i, arr.ind = TRUE)) 
} 

कौन सा तो res कंसोल पर प्रिंट आउट:

> res 
[[1]] 
    row col 
[1,] 1 1 
[2,] 2 1 

[[2]] 
    row col 
[1,] 2 4 

[[3]] 
    row col 
[1,] 3 3 

[[4]] 
    row col 
[1,] 5 1 
[2,] 5 2 
[3,] 5 3 
[4,] 5 4 
[5,] 5 5 

मैं नहीं आश्चर्य अगर वहाँ हालांकि अपने अंतिम लक्ष्य को रेखापुंज वस्तु से जाने के लिए एक बेहतर तरीका है किया जाएगा। 2000 मैट्रिक्स द्वारा 2000 में फिर से इसके लिए एक बड़ा सौदा नहीं होना चाहिए।


पुरानी (गलत जवाब), लेकिन लोग हैं, जो जुड़ा घटकों एक ग्राफ के चाहते हैं के लिए उपयोगी होना चाहिए।

आप अपने आसन्न मैट्रिक्स को नेटवर्क में बदलने और घटकों को वापस करने के लिए igraph पैकेज का उपयोग कर सकते हैं। आपका उदाहरण ग्राफ एक घटक है, इसलिए मैंने चित्रण के लिए एक किनारा हटा दिया।

library(igraph) 
mat = rbind(c(1,0,0,0,0), 
      c(1,0,0,1,0), 
      c(0,0,1,0,0), 
      c(0,0,0,0,0), 
      c(1,1,1,1,1)) 
g <- graph.adjacency(mat) %>% delete_edges("5|3") 
plot(g) 
clu <- components(g) 
groups(clu) 

अंतिम पंक्ति तो प्रॉम्प्ट पर रिटर्न:

> groups(clu) 
$`1` 
[1] 1 2 4 5 

$`2` 
[1] 3 

इस एल्गोरिथ्म के साथ मेरा अनुभव यह बहुत तेजी से होता है - तो मुझे नहीं लगता कि 2,000 2,000 से एक समस्या हो जाएगा।

+0

आपके उत्तर के लिए धन्यवाद, लेकिन मेरा मैट्रिक्स एक आसन्नता मैट्रिक्स नहीं है: यह ग्राफ का प्रतिनिधित्व नहीं करता है। मैं 1 के समूह के समूह ढूंढना चाहता हूं (यानी मैट्रिक्स में एडैसेंट)। – user3771535

+0

आह क्षमा करें - 'कनेक्टेड घटक' एक शब्द है जिसे मैंने पहले वर्णित किया है। ऐसा लगता है कि रास्टर पैकेज में 'क्लंप' नामक एक फ़ंक्शन है जो आप चाहते हैं। मैं देखूंगा कि क्या मैं एक उदाहरण चाबुक कर सकता हूं। –

+0

बहुत बहुत धन्यवाद, यह बहुत अच्छी तरह से काम करता है! – user3771535