【问题标题】:Summing values in one column until a certain value is encountered in another column对一列中的值求和,直到在另一列中遇到某个值
【发布时间】:2019-03-29 19:25:33
【问题描述】:

我试图对一列中的一系列行求和,直到遇到另一列中大于或等于阈值的值,将该总和输出到一个对象中并重复该过程并将下一个总和放入同一个对象。

我主要将 R 用于统计,而我编写代码的能力非常有限并且是自学的。目前,我有一系列数据集,每个数据集代表一个人。在每个数据集中,有两列感兴趣,大约有 17,000 行。我正在尝试对一列 (x) 中的连续行求和,直到在另一列 (a) 中遇到 0.17 或更大的值。一旦遇到这个值,我需要将该总和输出到另一个对象中。然后,从下一行开始,我需要对 x 中的所有值求和,直到在 a 中遇到 0.17 或更大的值。因此,到最后,我将拥有一个包含整个数据集的所有这些总和的对象。我尝试了一些使用循环和 if/else 的函数,但没有得到合理的结果。我什至不确定这是否是最好的方法,因此我们将不胜感激。

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)。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用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 在 cmets 中指出的那样,创建该分组向量的另一个选项是

    INDEX = cumsum(c(FALSE, head(a, -1)) >= 0.17)
    

    【讨论】:

    • INDEX = cumsum(c(FALSE, head(a, -1)) &gt;= 0.17) 是另一种选择
    • 太棒了,就是这样!显然我想多了,这在 R 中很容易。
    猜你喜欢
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多