Qual è il modo migliore di fare l'aggiunta di componente matrix se il numero di matrici da sommare non è noto in anticipo? Più in generale, esiste un buon metodo per eseguire operazioni di matrice (o array multidimensionale) nel contesto di data.table? Io uso data.table
per la sua efficienza nell'ordinamento e nel raggruppamento dei dati per mezzo di diverse variabili fisse, o categorie, ciascuna comprendente un diverso numero di osservazioni.operazioni con le matrici e aggiunta di componenti mediante data.table
Ad esempio:
- Trova il prodotto esterno di componenti vettoriali fornite in ciascuna osservazione (riga) dei dati, restituendo una matrice per ogni riga.
- Somma le matrici risultanti in base al componente su tutte le righe di ciascun raggruppamento di categorie di dati.
qui illustrate con matrici 2x2 e solo una categoria:
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
ho tentato una funzione per calcolare somma matrice sul prodotto esterno, %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.
}
che, naturalmente, non fa funziona perché sum
somma tutti gli elementi attraverso gli array.
vidi this answer utilizzando Reduce('+', .list)
ma che sembra richiedere già avere un list
di tutte le matrici da aggiungere. Non ho capito come farlo all'interno data.table
, così invece ho un ingombrante work-around:
# 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
e che dà i componenti sommate, che possono finalmente essere riconvertiti in matrici.
+1 Che grande prima domanda. Benvenuto in Stack Overflow. –