【问题标题】:Flag an entire group if a single row meets a condition using data.table如果单行满足使用 data.table 的条件,则标记整个组
【发布时间】:2019-12-10 08:43:04
【问题描述】:

我有以下示例数据:

> so <- data.table(Credit_id = rep(c("1-A", "17-F", "2-D"), each = 3), Period = rep(1:3, times = 3), Due_days = c(0,0,0, 0,30,0, 0,30,60))
> so
   Credit_id Period Due_days
1:       1-A      1        0
2:       1-A      2        0
3:       1-A      3        0
4:      17-F      1        0
5:      17-F      2       30
6:      17-F      3        0
7:       2-D      1        0
8:       2-D      2       30
9:       2-D      3       60

数据显示了三个不同的信用在投资组合的前三个月中的表现。 Credit_id 是主键,Period 是时间索引,Due_days 显示客户在给定时间段内逾期的天数。

我想创建一个新列 Flag,它可以采用两个值:0 和 1。如果信用(按 Credit_id 分组)等于或大于,Flag 应该采用值 1 30.

这是我想要得到的结果:

   Credit_id Period Due_days Flag
1:       1-A      1        0    0
2:       1-A      2        0    0
3:       1-A      3        0    0
4:      17-F      1        0    1
5:      17-F      2       30    1
6:      17-F      3        0    1
7:       2-D      1        0    1
8:       2-D      2       30    1
9:       2-D      3       60    1

也就是说,将1 分配给至少有一行Due_days &gt;= 30 的组。

【问题讨论】:

    标签: r group-by data.table


    【解决方案1】:

    你可以这样做:

    dt[, flag := +(any(Due_days >= 30)), by = Credit_id]
    
       Credit_id Period Due_days flag
    1:       1-A      1        0    0
    2:       1-A      2        0    0
    3:       1-A      3        0    0
    4:      17-F      1        0    1
    5:      17-F      2       30    1
    6:      17-F      3        0    1
    7:       2-D      1        0    1
    8:       2-D      2       30    1
    9:       2-D      3       60    1
    

    或者和base R一样:

    with(dt, ave(Due_days, Credit_id, FUN = function(x) +(any(x >= 30))))
    

    any() 测试每组是否至少有一个值满足条件。正如@Calum 您已经指出的那样,+ 只是将逻辑向量转换为整数向量的一种快速方法。

    说明+的用法:

    +(c(TRUE, FALSE))
    [1] 1 0
    

    其他可能性是:

    c(TRUE, FALSE) * 1
    

    或者:

    as.integer(c(TRUE, FALSE))
    

    【讨论】:

    • 这比我的典型方法高效得多。谢谢!您介意详细说明语法吗?比如,为什么会有+ 标志?我以前从未见过。
    • 不是 OP,但这只是将any 的逻辑输出转换为整数的快速方法。如果不熟悉并且不需要纳秒,您也可以使用 as.integer 来提高可读性。
    • 太棒了。所以+any(.)等同于as.integer(any(.))
    • 是的,你可以这么说:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 2018-12-21
    • 2017-01-13
    • 1970-01-01
    相关资源
    最近更新 更多