r - 计算先前出现的值大于当前值的次数
问题描述
我正在尝试创建一个列,其中包含比当前值大一的值的先前出现次数(按日期排序)。在此处提供的示例中,我在标记为“wanted”的列中手动创建了我想要的值,该值等于 RoundNo 的先前出现的计数(按“日期”排序)等于焦点行大一圆号 我需要为每个单独的 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 将其应用于连续较大的RoundNo
.
library(zoo)
Count <- function(x) sum(x == tail(x, 1) + 1)
dt[, wanted := rollapplyr(as.numeric(RoundNo), 1:.N, Count), by = InvestorID]
2)另一种方法是使用自左连接,其中dt
aliased to的第一个实例a
左连接到 aliased 的第二个实例,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]
推荐阅读
- swift - 是否有一种通用的方法来处理异步和快速抛出的组合
- domain-driven-design - 如何处理resolvejs中聚合根之间的关系
- java - JSF 状态持有者保护程序内存泄漏
- java - 错误:无法在 AutoCompleteTextView 中推断 ArrayAdapter<> 的类型参数
- redis - Redis BITCOUNT 行为
- r - 使用逗号分隔的字符串查找数据集变量中的所有项目
- javascript - 另一个 Promise 的 .then() 内的 for-each 循环内的 Promise 链
- java - 多种类型的杰克逊反序列化接口
- r - R shapefile 找不到并加载问题
- android - getExternalFilesDirs 不返回 SD 卡,仅返回内部/内置存储