Суммирование значений в одном столбце до определенного значения в другом столбце - PullRequest
1 голос
/ 29 марта 2019

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

Я использовал R в основном для статистики, и моя способность писать код довольно ограничена и самоучка. В настоящее время у меня есть ряд наборов данных, и каждый набор данных представляет человека. В каждом наборе данных есть два интересующих столбца и примерно 17 000 строк. Я пытаюсь суммировать последовательные строки из одного столбца (x), пока в другом столбце (a) не встретится значение 0,17 или более. Как только это значение будет найдено, мне нужно, чтобы эта сумма была выведена в другой объект. Затем, начиная со следующей строки, мне нужно сложить все значения в x, пока в a не встретится значение 0.17 или больше. Итак, к концу у меня будет объект, который содержит все эти суммы для всего набора данных. Я пробовал некоторые функции, которые используют цикл и если / еще, но я не получаю ощутимых результатов. На самом деле я даже не уверен, что это лучший подход, поэтому любой вклад будет принят с благодарностью.

x <- c(1,2,3,4,5,6,7,8,7,6,5,4,3,2,1)
a <- c(0.05, .10, 0.1, 0.19, 0.12, 0.15, 0.20, 0.01, 0.08, 0.11, 0.18, 0.14, 0.17, 0.01, 0.02)

summing <- function(x) {
    s <- 0
    leng <- Inf
    n <- nrow(data2)
    for(x in 1:(n-1)){
        step2<- if(data2$a <= 0.17){
            s <- s + x[1]
        }   
    }
    return(results)
}
summing(data2$step)

summing <- function(x) {
    count <- 1
    begin <- 1
    results <- list()
    x <- rbind(x, c(1))
    n <- nrow(x)
    for(i in n){
        step <- sum(x[i,2], x[i + 1, 2])
        t <- x[i +1, 3]
        if(abs(x[i + 1, 3]) <= 0.17){
            begin <- i + step 
        }
        if(abs(x[i + 1, 3]) > 0.17){
            results[[count]] <- begin:1
            count <- count + 1
        }
    }
    return(results)
}

С данными этого примера мне нужен объект, который бы суммировал первые четыре значения вместе (10), затем 5-7 (18), 8-11 (26), 12-13 (7), 14-15 (3).

1 Ответ

3 голосов
/ 29 марта 2019

Вы можете использовать tapply

INDEX <- cumsum(a >= 0.17) - (a >= 0.17)
out <- tapply(X = x, INDEX = INDEX, FUN = sum)
out
# 0  1  2  3  4 
#10 18 26  7  3

Где INDEX определяется как

INDEX
# [1] 0 0 0 0 1 1 1 2 2 2 2 3 3 4 4

Как отметил @ d.b в комментариях, другой вариант для создания этого вектора группировки -

INDEX = cumsum(c(FALSE, head(a, -1)) >= 0.17)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...