Накопленная сумма вектора между нулями - PullRequest
0 голосов
/ 17 сентября 2018

Мне нужна помощь. Я хотел бы рассчитать индекс, в котором ранее вычисленное значение добавляется к следующему, пока не будет 0, и оттуда добавление начинается снова.

Вот что я пробовал:

NIVtest <- NIV[1:35,1]
NIVtest <- data.frame(NIVtest)

test <- matrix(nrow=35,ncol=1)
test <- as.data.frame(test)
names(test) <- "NI"
test
test[1,1] <- 0

for(i in 1:35){

  NI = results[i,1]+NIVtest[i+1,1]
  test[i+1,1] <- NI[1]
}

Вот тест-данные:

df <- data.frame(NIVtest = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.5, 18.92, 28.98, 13.39, 9.24, 29.38, 55.25, 0, 15.86, 7.52, 0))

и вот ожидаемые результаты:

c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.5, 32.42, 61.4, 74.79, 84.03, 113.41, 168.66, 0, 15.86, 23.38, 0)

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Вот как это сделать с помощью цикла:

# your data
vec <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
         0, 0, 0, 0, 13.5, 18.92, 28.98, 13.39, 9.24, 29.38, 55.25, 0, 
         15.86, 7.52, 0)

n <- length(vec)

# empty vector to store results
result <- vector(length=n)

# loop time!
for(i in seq(n)) {
    if(vec[i]==0) {
        result[i] <- 0
    } else {
        result[i] <- result[i-1] + vec[i]
    }
}
0 голосов
/ 17 сентября 2018

Один подход с data.table:

# load data.table
library(data.table)

# convert your dataframe (assuming it's named df) to a data.table
dt <- as.data.table(df)

# create a group id for each set of numbers between the zeros
dt[ , groupid := rleid(NIVtest==0)]

# create the desired index
dt[ , index := cumsum(NIVtest), by=groupid]

Результат:

> dt[ , .(NIVtest, index)]
    NIVtest  index
 1:    0.00   0.00
 2:    0.00   0.00
 3:    0.00   0.00
 4:    0.00   0.00
 5:    0.00   0.00
 6:    0.00   0.00
 7:    0.00   0.00
 8:    0.00   0.00
 9:    0.00   0.00
10:    0.00   0.00
11:    0.00   0.00
12:    0.00   0.00
13:    0.00   0.00
14:    0.00   0.00
15:    0.00   0.00
16:    0.00   0.00
17:    0.00   0.00
18:    0.00   0.00
19:    0.00   0.00
20:    0.00   0.00
21:    0.00   0.00
22:    0.00   0.00
23:    0.00   0.00
24:    0.00   0.00
25:   13.50  13.50
26:   18.92  32.42
27:   28.98  61.40
28:   13.39  74.79
29:    9.24  84.03
30:   29.38 113.41
31:   55.25 168.66
32:    0.00   0.00
33:   15.86  15.86
34:    7.52  23.38
35:    0.00   0.00
...