मैट्रिक्स की संख्या अभिव्यक्त किया जा सकता है अगर अग्रिम में नहीं जाना जाता है घटक-वार matrix इसके अलावा करने के लिए सबसे अच्छा तरीका क्या है? अधिक आम तौर पर, data.table के संदर्भ में मैट्रिक्स (या बहु-आयामी सरणी) संचालन करने का कोई अच्छा तरीका है? मैं data.table
का उपयोग कई निश्चित चर या डेटा द्वारा डेटा को सॉर्ट करने और समूहित करने में अपनी दक्षता के लिए करता हूं, जिनमें प्रत्येक में अलग-अलग अवलोकन शामिल होते हैं।मैट्रिक्स संचालन और घटक-वार इसके अलावा का उपयोग कर data.table
उदाहरण के लिए:
- , डेटा के प्रत्येक अवलोकन (पंक्ति) में दिए गए सदिश घटकों के बाहरी उत्पाद का पता लगाएं प्रत्येक पंक्ति के लिए एक मैट्रिक्स लौटने।
- योग जिसके परिणामस्वरूप मैट्रिक्स घटक-वार डेटा श्रेणियों में से प्रत्येक समूह के सभी पंक्तियों पर।
यहाँ 2x2 मैट्रिक्स के साथ सचित्र और केवल एक श्रेणी:
library(data.table)
# example data, number of rows differs by category t
N <- 5
dt <- data.table(t = rep(c("a", "b"), each = 3, len = N),
x1 = rep(1:2, len = N), x2 = rep(3:5, len = N),
y1 = rep(1:3, len = N), y2 = rep(2:5, len = N))
setkey(dt, t)
> dt
t x1 x2 y1 y2
1: a 1 3 1 2
2: a 2 4 2 3
3: a 1 5 3 4
4: b 2 3 1 5
5: b 1 4 2 2
मैं बाहरी उत्पाद पर मैट्रिक्स राशि की गणना करने के लिए एक समारोह का प्रयास किया, %o%
mat_sum <- function(x1, x2, y1, y2){
x <- c(x1, x2) # x vector
y <- c(y1, y2) # y vector
xy <- x %o% y # outer product (i.e. 2x2 matrix)
sum(xy) # <<< THIS RETURNS A SINGLE VALUE, NOT WHAT I WANT.
}
जो, ज़ाहिर है, नहीं है काम क्योंकि sum
सरणी में सभी तत्व जोड़ता है।
मैंने this answerReduce('+', .list)
का उपयोग करके देखा लेकिन ऐसा लगता है कि सभी मैट्रिक्स के list
जोड़े जाने की आवश्यकता है। मैं पता लगा नहीं कि कैसे करना है data.table
भीतर है, इसलिए बजाय मैं एक बोझिल काम के आसपास मिल गया है:
# extract each outer product component first...
mat_comps <- function(x1, x2, y1, y2){
x <- c(x1, x2) # x vector
y <- c(y1, y2) # y vector
xy <- x %o% y # outer product (i.e. 2x2 matrix)
xy11 <- xy[1,1]
xy21 <- xy[2,1]
xy12 <- xy[1,2]
xy22 <- xy[2,2]
return(c(xy11, xy21, xy12, xy22))
}
# ...then running this function on dt,
# taking extra step (making column 'n') to apply it row-by-row...
dt[, n := 1:nrow(dt)]
dt[, c("xy11", "xy21", "xy12", "xy22") := as.list(mat_comps(x1, x2, y1, y2)),
by = n]
# ...then sum them individually, now grouping by t
s <- dt[, list(s11 = sum(xy11),
s21 = sum(xy21),
s12 = sum(xy12),
s22 = sum(xy22)),
by = key(dt)]
> s
t s11 s21 s12 s22
1: a 8 26 12 38
2: b 4 11 12 23
और कहा कि इसे यूं घटक है, जो अंत में मैट्रिक्स को वापस परिवर्तित किया जा सकता देता है।
+1 क्या एक महान पहला सवाल। स्टैक ओवरफ़्लो में आपका स्वागत है। –