Biorąc pod uwagę ogólny nxn matrix - na przykład:Suma niektórych pozycjach w rzędzie - R
A <- matrix(1:16, nrow = 4, ncol = 4)
Jak mogę obliczyć sumę wierszy w trójkącie „prawy dolny” i pokazać informacje w wektor?
Biorąc pod uwagę ogólny nxn matrix - na przykład:Suma niektórych pozycjach w rzędzie - R
A <- matrix(1:16, nrow = 4, ncol = 4)
Jak mogę obliczyć sumę wierszy w trójkącie „prawy dolny” i pokazać informacje w wektor?
Oto rozwiązanie. Kluczem jest użycie funkcji lower.tri
lub upper.tri
, a następnie użycie apply
do sortowania każdego wiersza lub kolumny. Na koniec obliczyć sumę każdego rzędu.
# Create example data frame
m <- matrix(1:16, 4)
m
# [,1] [,2] [,3] [,4]
# [1,] 1 5 9 13
# [2,] 2 6 10 14
# [3,] 3 7 11 15
# [4,] 4 8 12 16
# Calculate the sum
rowSums(m * apply(lower.tri(m), 1, sort))
# [1] 0 14 26 36
rowSums(m * apply(upper.tri(m), 2, sort))
# [1] 0 14 26 36
A = matrix(1:16, 4)
A
# [,1] [,2] [,3] [,4]
# [1,] 1 5 9 13
# [2,] 2 6 10 14
# [3,] 3 7 11 15
# [4,] 4 8 12 16
sapply(1:NROW(A), function(i) sum(tail(A[i,], i - 1)))
#[1] 0 14 26 36
Znajdź maskę, która obudowuje dane życzenia:
> mask <- apply(lower.tri(A, diag = FALSE), 1, rev)
> mask
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE TRUE
[3,] FALSE FALSE TRUE TRUE
[4,] FALSE TRUE TRUE TRUE
pomnożymy tę maskę i obliczania sum:
> A * mask
[,1] [,2] [,3] [,4]
[1,] 0 0 0 0
[2,] 0 0 0 14
[3,] 0 0 11 15
[4,] 0 8 12 16
> rowSums(A * mask)
[1] 0 14 26 36
Jak o po prostu 'rowSums (A * lower.tri (A) [, ncol (A): 1]) " –