आर

2014-07-01 2 views
13

में मैट्रिक्स में प्रत्येक पंक्ति से निरंतर वेक्टर घटाएं मेरे पास 5 कॉलम और 4 पंक्तियों वाला मैट्रिक्स है। मेरे पास 3 कॉलम वाला वेक्टर भी है। मैं मैट्रिक्स की प्रत्येक पंक्ति पर क्रमशः कॉलम 3,4 और 5 से वेक्टर में मान घटाना चाहता हूं।आर

b <- matrix(rep(1:20), nrow=4, ncol=5) 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 5 9 13 17 
[2,] 2 6 10 14 18 
[3,] 3 7 11 15 19 
[4,] 4 8 12 16 20 

c <- c(5,6,7) 

पाने के लिए

 [,1] [,2] [,3] [,4] [,5] 
[1,] 1 5 4 7 10 
[2,] 2 6 5 8 11 
[3,] 3 7 6 9 12 
[4,] 4 8 7 10 13 
+1

बहुत उपयोगी है, हालांकि नहीं एक नकली। यह विभाजन के बारे में है, दूसरा विभाजन के बारे में है। कुछ जवाब जो विभाजन के लिए काम करते हैं, घटाव के लिए काम नहीं करते हैं। अन्य करते हैं। – Adi

उत्तर

5

शायद कि सुरुचिपूर्ण नहीं, लेकिन

b <- matrix(rep(1:20), nrow=4, ncol=5) 
x <- c(5,6,7) 

b[,3:5] <- t(t(b[,3:5])-x) 

चाल करना चाहिए। हम मैट्रिक्स को केवल उस भाग को बदलने के लिए सबसेट करते हैं, जिसे हम चाहते हैं, और हम मैट्रिक्स को फ़्लिप करने के लिए t() (ट्रांसपोज़) का उपयोग करते हैं, इसलिए सरल वेक्टर रीसाइक्लिंग सही पंक्ति से घटाने का ख्याल रखेगा।

आप स्थानांतरित करने से बचना चाहते हैं, तो आप कुछ तरह

b[,3:5] <- b[,3:5]-x[col(b[,3:5])] 

रूप में अच्छी तरह कर सकता है। यहां हम दो बार सब्सक्राइब करते हैं, और हम x में प्रत्येक मान के लिए सही कॉलम प्राप्त करने के लिए दूसरे का उपयोग करते हैं क्योंकि वे दोनों मैट्रिस उसी क्रम में अनुक्रमित होंगे।

मुझे लगता है कि सवाल यह है कि जुड़ा हुआ @thelatemail से मेरी पसंदीदा एक सरल समाधान था

b[,3:5] <- sweep(b[,3:5], 2, x, `-`) 
+0

एक शर्म की बात है कि डुप्लिकेट में सबसे तेज़ समाधान ('mat% *% diag (1/dev)') का आसानी से घटाव में अनुवाद नहीं किया जा सकता है। '(मैट% *% डायग (1/देव) -1)% *% डायग (देव)' दोनों बदसूरत और धीमे हैं कि डबल-ट्रांज़ेक्शन: \ – MichaelChirico

1

:

b <- matrix(rep(1:20), nrow=4, ncol=5) 
c <- c(5,6,7) 

for(i in 1:nrow(b)) { 
    b[i,3:5] <- b[i,3:5] - c 
} 
2

एक और तरीका है, लागू के साथ:

b[,3:5] <- t(apply(b[,3:5], 1, function(x) x-c)) 
25

यह ठीक है sweep के लिए बनाया गया था:

b <- matrix(rep(1:20), nrow=4, ncol=5) 
x <- c(5,6,7) 

b[,3:5] <- sweep(b[,3:5],2,x) 
b 

#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 1 5 4 7 10 
#[2,] 2 6 5 8 11 
#[3,] 3 7 6 9 12 
#[4,] 4 8 7 10 13 

..or भी subsetting या पुनर्निर्धारण के बिना:

sweep(b,2,c(0,0,x))