【问题标题】:R: How to write a function to do summation of a particular column values and report the row numbers when it meet certain criteria?R:如何编写一个函数来对特定列的值进行求和并在满足特定条件时报告行号?
【发布时间】:2024-01-20 16:11:01
【问题描述】:

我是R 的新手,专门编程function。所以,如果您能帮助理解这些概念,我将不胜感激。

我想知道如何编写function 来执行以下操作:

1-add某些variable(列)line by line (row by row)
的值 2- 那么如果sum 的值大于100; >100
3- 然后,stop 并报告所有行从乞讨到满足条件(总和

举个例子:

DT <- data.table(ID = c(1:21),Var1 = LETTERS[1:21], Var2 = seq(9, 19, .5))
> DT
    ID Var1 Var2
 1:  1    A  9.0
 2:  2    B  9.5
 3:  3    C 10.0
 4:  4    D 10.5
 5:  5    E 11.0
 6:  6    F 11.5
 7:  7    G 12.0
 8:  8    H 12.5
 9:  9    I 13.0
10: 10    J 13.5
11: 11    K 14.0
12: 12    L 14.5
13: 13    M 15.0
14: 14    N 15.5
15: 15    O 16.0
16: 16    P 16.5
17: 17    Q 17.0
18: 18    R 17.5
19: 19    S 18.0
20: 20    T 18.5
21: 21    U 19.0
    ID Var1 Var2

我想逐行 add Var2 中的所有值,直到 total sum 变为 &gt; 100 然后它会停止并从头开始报告所有行,直到它满足此条件。

在这种情况下,我的意思是,它将 Var2 中的所有值从 ID 1:9 (9.0 +9.5+10+10.5+11+11.5+12+12.5+13) 中添加,总数将为 99,如果添加下一行 (13.5),则值将是 112.5 .

因此预期的输出是:

 ID Var1 Var2
 1:  1    A  9.0
 2:  2    B  9.5
 3:  3    C 10.0
 4:  4    D 10.5
 5:  5    E 11.0
 6:  6    F 11.5
 7:  7    G 12.0
 8:  8    H 12.5
 9:  9    I 13.0

我尝试了不同的东西,但对我来说它们根本没有用,因此,我在这里不包括它们。

【问题讨论】:

    标签: r function loops if-statement datatable


    【解决方案1】:

    如果我理解的话,它似乎并不复杂。在base R

    DT[cumsum(DT$Var2) < 100, ]
    

    作为一个函数,这可以按以下方式完成。请注意,我将上述内容分成两行代码,以使其更具可读性。大约 6 个月后它会付款。

    keep_below <- function(x, column = "Var2", threshold = 100){
        inx <- cumsum(x[[column]]) < threshold
        x[inx, ]
    }
    
    keep_below(DT)
    

    【讨论】:

    • 非常感谢。 cumsum 是我不知道的那个。如果可能的话,我也请你帮我知道,不管cumsum,我怎么能通过写function来做到这一点
    • @Daniel 好的,你是对的,我忘记了你问题的那一部分。我将对其进行测试,然后编辑我的答案。请稍等。
    最近更新 更多