2017-12-09 5 views

Antwort

1

Hier ist eine Lösung. Der Schlüssel ist, lower.tri oder upper.tri Funktion zu verwenden, und dann apply verwenden, um jede Zeile oder Spalte zu sortieren. Berechnen Sie schließlich die Summe jeder Zeile.

# 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 
2
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 
6

eine Maske finden, die die gewünschten Daten kapselt:

> 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 

Multiply diese Maske und berechnen Summen:

> 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 
+5

Wie wäre es nur 'rowSums (A * lower.tri (A) [, ncol (A): 1]) ' –