2015-03-03 9 views
5

मैं मैट्रिक्स की एक सूची है मान लीजिए:मैट्रिक्स की एक सूची में प्रत्येक पंक्ति के 2 उच्चतम मूल्यों रखें r

$`2010` 
    1 2 3 4 
1 0 3 5 6 
2 5 1 9 5 
3 0 0 0 0 
4 10 10 10 0 

$`2011` 
    1 2 3 4 
1 0 2 3 6 
2 5 0 3 1 
3 2 4 0 1 
4 2 1 2 1 

कोड मैट्रिक्स बनाने के लिए:

cntry<-c(1,2,3,4) 
a<-c(0,5,0,10) 
b<-c(3,1,0,10) 
c<-c(5,9,0,10) 
d<-c(6,5,0,0) 
k<-data.frame(a,b,c,d) 
k<-as.matrix(k) 
dimnames(k)<-list(cntry,cntry) 

e<-c(0,5,2,2) 
f<-c(2,0,4,1) 
g<-c(3,3,0,2) 
h<-c(6,1,1,1) 
l<-data.frame(e,f,g,h) 
l<-as.matrix(l) 
dimnames(l)<-list(cntry,cntry) 

list<-list(k,l) 
names(list)<-2010:2011 

मैं रखना चाहते हैं प्रत्येक पंक्ति में दो उच्चतम मान, और उसी पंक्ति में अन्य कोशिकाओं के शेष छोटे मानों को 0 के साथ प्रतिस्थापित करें।

यदि दो से अधिक कोशिकाएं हैं जिनके पास उच्चतम मूल्य है, तो मैं उन सभी कोशिकाओं को छोड़ना चाहता हूं (उदाहरण के लिए: 10 10 10 0-> 10 10 10 0, 5 1 9 5 -> 5 0 9 5)। पंक्ति की सभी अन्य कोशिकाओं को फिर से 0 पर सेट किया जाना चाहिए।

परिणाम इस तरह दिखना चाहिए:

$`2010` 
    1 2 3 4 
1 0 0 5 6 
2 5 0 9 5 
3 0 0 0 0 
4 10 10 10 0 

$`2011` 
    1 2 3 4 
1 0 0 3 6 
2 5 0 3 0 
3 2 4 0 0 
4 2 0 2 0 

मुझे यकीन है कि कैसे इस समस्या दृष्टिकोण नहीं हूँ, इसलिए किसी भी मदद अत्यधिक का स्वागत है!

उत्तर

4

यहाँ एक दृष्टिकोण है:

lapply(list, function(x) { 
    t(apply(x, 1, function(y) { 
    y[!y %in% tail(sort(y), 2)] <- 0 
    y 
    })) 
}) 

## $`2010` 
## 1 2 3 4 
## 1 0 0 5 6 
## 2 5 0 9 5 
## 3 0 0 0 0 
## 4 10 10 10 0 
## 
## $`2011` 
## 1 2 3 4 
## 1 0 0 3 6 
## 2 5 0 3 0 
## 3 2 4 0 0 
## 4 2 0 2 0 

यह सूची के तत्वों (lapply के साथ) से अधिक पुनरावृत्ति वस्तु x के रूप में बारी में प्रत्येक के इलाज से काम करता है, और फिर बार-बार दोहराना कि x की पंक्तियों पर (apply(x, 1, ...) साथ) पंक्ति y पर कॉल करके और इसमें एक फ़ंक्शन लागू करना।

समारोह सूची तत्व x की पंक्ति y के लिए आवेदन किया है:

function(y) { 
    y[y < tail(sort(y), 2)] <- 0 
    y 
} 

जो पंक्ति (tail(sort(y), 2)) के दो सबसे अधिक मूल्यवान तत्व की पहचान करता है, एक तार्किक वेक्टर रिटर्न y के तत्वों में से जो यह दर्शाता है उस सेट में नहीं हैं (y < ... के साथ), उस लॉजिकल वेक्टर के साथ वेक्टर y के तत्वों को सबसेट करता है, और इन तत्वों के लिए 0 असाइन करता है। अंत में, यह संशोधित y लौटाता है।

+2

शायद 'y <' का उपयोग करें क्योंकि यह '% में'% से तेज़ होगा? इसके अलावा, फ्लोटिंग पॉइंट नंबरों के साथ बेहतर काम करने की संभावना है। +1। – BrodieG

+0

@ ब्रोडीजी अच्छा बिंदु! धन्यवाद। – jbaums

संबंधित मुद्दे

 संबंधित मुद्दे