[英]Count prior occurences of value one greater than current value
我正在尝试创建一个列,其中包含比当前值大 1 的值的先前出现次数(按日期排序)。 在此处提供的示例中,我在标记为“想要”的列中手动创建了我想要的值,该值等于 RoundNo 的先前出现次数(按“日期”排序)的次数,这些次数比焦点行大 1回合数我需要为每个单独的 InvestorID 按组单独计算。
因此,第一行“想要的”值等于投资者 1 的先前 RoundNo 的计数,其中 RoundNo == 3(也就是比第一行的 RoundNo 大 2)。 所以在这种情况下,这将是 0。类似地,对于第二行,“想要的”值是投资者 1 的先前 RoundNo 的计数,其中 RoundNo == 2(也就是比第二行的 RoundNo 大 1)。 所以在这种情况下,这将是 1。希望得到任何帮助。 代码示例如下。 谢谢!
dt = as.data.table(cbind(c(rep(1,7),rep(2,7)),
c("2019-08-01","2019-09-01","2019-10-01","2019-11-01","2019-12-01","2021-04-01","2021-10-01",
"2019-01-01","2019-02-01","2019-04-01","2019-08-01","2019-09-01","2019-10-01","2019-11-01"),
c(2,1,2,2,1,3,2,1,2,3,2,1,3,1)))
names(dt) = c("InvestorID","date","RoundNo")
wanted = c(0,1,0,0,3,0,1,0,0,0,1,2,0,2)
dt$wanted = wanted
1)定义一个函数Count
,它计算其向量输入的每个元素等于 1 加上其最后一个元素的次数。 然后使用 rollapplyr 将其应用于每个 InvestorID 内的序列号。
library(zoo)
Count <- function(x) sum(x == tail(x, 1) + 1)
dt[, wanted := rollapplyr(as.numeric(RoundNo), 1:.N, Count), by = InvestorID]
2)另一种方法是使用自左连接在其中的第一个实例dt
别名为a
是左接合的第二实例dt
别名为b
相关联的那些b
行,其来自相同InvestorID
之前或在与来a
排。 由集团a
排,走在适当的总和b
行。
library(sqldf)
sqldf("select a.*, sum(a.RoundNo + 1 == b.RoundNo) wanted
from dt a
left join dt b on a.InvestorID = b.InvestorID and b.rowid <= a.rowid
group by a.rowid")
3)此替代方案仅使用 data.table。 Count
来自(1)。
dt[, wanted := sapply(1:.N, function(i) Count(as.numeric(RoundNo)[1:i])),
by = InvestorID]
另一个使用Reduce
data.table
解决方案:
dt[order(date),.(date,
result=lapply(Reduce('c',as.numeric(RoundNo),accumulate=T),
function(x) sum(x==last(x)+1)),
wanted), by=InvestorID]
InvestorID date result wanted
1: 2 2019-01-01 0 0
2: 2 2019-02-01 0 0
3: 2 2019-04-01 0 0
4: 2 2019-08-01 1 1
5: 2 2019-09-01 2 2
6: 2 2019-10-01 0 0
7: 2 2019-11-01 2 2
8: 1 2019-08-01 0 0
9: 1 2019-09-01 1 1
10: 1 2019-10-01 0 0
11: 1 2019-11-01 0 0
12: 1 2019-12-01 3 3
13: 1 2021-04-01 0 0
14: 1 2021-10-01 1 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.