gpt4 book ai didi

r - if 表达式的简单求和

转载 作者:行者123 更新时间:2023-12-04 02:49:49 26 4
gpt4 key购买 nike

这些是我的示例数据:

dt <- data.table(id=c("a","a","a","a","b","b"), monthsinarrears=c(0,1,0,0,1,0), date=c(2013,2014,2015,2016,2014,2015))

该表如下所示:
> dt
id monthsinarrears date
1: a 0 2013
2: a 1 2014
3: a 0 2015
4: a 0 2016
5: b 1 2014
6: b 0 2015

现在我想创建一个名为“EverinArrears”的附加列,如果 id 曾经拖欠(历史上),它将被分配为“1”,如果不是,则分配为“0”。因此我想获得的输出是:
   id monthsinarrears date EverinArrears
1: a 0 2013 0
2: a 1 2014 1
3: a 0 2015 1
4: a 0 2016 1
5: b 1 2014 1
6: b 0 2015 1

请注意,贷款 ID a从历史上看,2013 年没有欠款(这发生在 2014 年),所以这就是为什么 EverinArrears 在 2013 年也得到 0 零。

最佳答案

您可以执行以下操作(感谢@Roland 提供避免数字 > 1 的提示):

dt[, EverinArrears := as.integer(as.logical(cumsum(monthsinarrears))), by=id]

输出:
#   id monthsinarrears date EA
#1: a 0 2013 0
#2: a 1 2014 1
#3: a 0 2015 1
#4: a 0 2016 1
#5: b 1 2014 1
#6: b 0 2015 1

注:如果你喜欢较短的代码,你也可以这样做
dt[, EverinArrears := +(!!(cumsum(monthsinarrears))), by=id]

虽然不像 as.integer(as.logical(...)) 那样“好的做法”

正如@Jaap 所提到的,你也可以这样做:
dt[, EverinArrears := +(cumsum(monthsinarrears) > 0), by = id]

或者,为了更好的练习:
dt[, EverinArrears := as.integer(cumsum(monthsinarrears) > 0), by = id]

正如@Arun 在评论中所建议的,另一种更简单的方法:
dt[, EverinArrears := cummax(monthsinarrears), by = id]

关于r - if 表达式的简单求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32944507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com