합계 수를 미리 알 수없는 경우 구성 요소 별 matrix 추가를 수행하는 가장 좋은 방법은 무엇입니까? 보다 일반적으로, data.table 컨텍스트에서 행렬 (또는 다차원 배열) 연산을 수행하는 좋은 방법이 있습니까? 나는 여러 가지 고정 변수 또는 카테고리별로 데이터를 정렬하고 그룹화 할 때 효율성이 뛰어나므로 data.table
을 사용합니다. 각각은 다른 수의 관측치로 구성됩니다. 예를 들어data.table을 사용하여 행렬 연산 및 구성 요소 별 추가
:
- 각 행의 매트릭스를 반환하는 데이터의 각 관찰 (행)에 주어진 벡터 성분의 외적을 찾는다.
- 데이터 카테고리의 각 그룹의 모든 행에 대해 결과 행렬을 구성 요소별로 합합니다. 물론,하지 않는,
%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. }
을
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
내가 외적을 행렬 합을 계산하는 기능을 시도 : 여기
는 2 × 2 행렬로 도시되고 하나의 카테고리 sum
은 배열 전체의 모든 요소를 더하기 때문에 작동합니다.
나는 Reduce('+', .list)
을 사용하여 this answer을 보았지만, 추가 할 모든 행렬 중 이미 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
그리고 마침내 행렬로 다시 변환 할 수있는 표현하는 구성 요소를 제공합니다.
일이 얼마나 큰 첫 번째 질문. 스택 오버플로에 오신 것을 환영합니다. –