Ես ունեմ մեծ մատրիցա/տվյալների շրջանակ (2500x20) և պետք է, ըստ սյունակի, գլորվող շեղում մաքսիմումով, քան նախորդ բոլոր բջիջների նվազագույնը, բացառելով հոսանքը:
Ես իմ ֆունկցիան կիրառում եմ սյունակով: Իմ ֆունկցիան տեղափոխում է ամբողջ սյունակը (որպես վեկտոր) 1:length-ով՝ արտադրելով ցուցակների ցանկ: Ինձ սա պետք է որպես մատրիցա max(x)-min(x) ֆունկցիան կիրառելու համար: Սա աշխատում է փոքր մատրիցայի համար և չափազանց երկար է աշխատում ինձ անհրաժեշտ չափի համար:
(փոքր) աղբյուրը (տրամադրված).
[,1] [,2] [,3] [,4] [,5]
[1,] 55 9 99 0 NA
[2,] 54 7 98 1 NA
[3,] 56 12 97 2 NA
[4,] 53 8 96 3 1
[5,] 57 22 95 4 0
[6,] 52 51 94 5 -1
[7,] 58 6 93 6 NA
[8,] 51 6 93 7 0
[9,] 59 51 92 8 2
[10,] 50 78 91 9 NA
[11,] 60 12 90 10 NA
[12,] 49 5 89 11 -2
Ակնկալվող արդյունքը.
[,1] [,2] [,3] [,4] [,5]
[1,] 0 0 0 0 0
[2,] 0 0 0 0 0
[3,] 1 2 1 1 0
[4,] 2 5 2 2 0
[5,] 3 5 3 3 0
[6,] 4 15 4 4 1
[7,] 5 44 5 5 2
[8,] 6 45 6 6 2
[9,] 7 45 6 7 2
[10,] 8 45 7 8 3
[11,] 9 72 8 9 3
[12,] 10 72 9 10 3
Առաջին արդյունքի տողը միշտ կլինի 0, քանի որ այն չունի նախորդ տողեր, որոնցից կարող է հաշվարկվել:
Երկրորդ արդյունքի տողը միշտ կլինի զրո, քանի որ նախորդ մեկ տողը առավելագույն և նվազագույն արժեքն է:
Վերջին աղբյուրը - շարքը երբեք չի ազդի արդյունքի վրա:
Ինչ ունեմ մինչ այժմ.
library(data.table)
mytest <- matrix(c(
55, 9,99, 0,NA,
54, 7,98, 1,NA,
56,12,97, 2,NA,
53, 8,96, 3, 1,
57,22,95, 4, 0,
52,51,94, 5,-1,
58, 6,93, 6,NA,
51, 6,93, 7, 0,
59,51,92, 8, 2,
50,78,91, 9,NA,
60,12,90,10,NA,
49, 5,89,11,-2
), ncol=5, byrow = TRUE)
rolling_deviation <- function (a_column){
tmp1 = shift(a_column, 1:(length(a_column)-1), NA, "lag")
tmp2 = matrix(unlist(tmp1), ncol = length(a_column), byrow = TRUE)
apply(tmp2,2,function(x){
x = x[!is.na(x)]
ifelse(length(x)==0, 0, max(x) - min(x))
})
}
apply(mytest,2,rolling_deviation)
Ինձ սա պետք է ավելի արագ հաշվարկելու համար, քանի որ դիտարկումները շատանում են, ավելի շատ տողեր կլինեն: