Cách tốt nhất để làm thành phần khôn ngoan matrix Ngoài ra nếu số lượng ma trận được tổng kết không được biết trước? Nói chung, có cách nào tốt để thực hiện các hoạt động ma trận (hoặc mảng đa chiều) trong ngữ cảnh của data.table? Tôi sử dụng data.table
cho hiệu quả của nó khi phân loại và nhóm dữ liệu theo một số biến cố định hoặc danh mục, mỗi biến bao gồm một số quan sát khác nhau.hoạt động ma trận và bổ sung thành phần khôn ngoan bằng cách sử dụng data.table
Ví dụ:
- Tìm sản phẩm bên ngoài các thành phần vector được đưa ra trong mỗi quan sát (hàng) của dữ liệu, trở về một ma trận cho mỗi hàng.
- Tổng hợp ma trận kết quả thành thạo trên tất cả các hàng của từng nhóm danh mục dữ liệu.
đây minh họa bằng các ma trận 2x2 và chỉ có một loại:
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
Tôi đã cố gắng một hàm để tính toán ma trận tổng trên sản phẩm bên ngoài, %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.
}
đó, tất nhiên, không làm việc vì sum
thêm tất cả các phần tử trên các mảng.
Tôi đã thấy this answer sử dụng Reduce('+', .list)
nhưng điều đó dường như yêu cầu phải có một list
của tất cả ma trận được thêm vào. Tôi chưa tìm ra cách để làm điều đó trong vòng data.table
, vì vậy thay vào đó tôi đã có một cồng kềnh công việc xung quanh:
# 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
và cung cấp cho các thành phần tóm tắt, mà cuối cùng có thể được chuyển đổi trở lại ma trận.
+1 Thật là một câu hỏi lớn đầu tiên. Chào mừng bạn đến với Stack Overflow. –