查找从一个 data.table 到另一个 data.table 的十分位数(也许:如何将 by= 参数带入另一个过滤器??)
Lookup deciles from one data.table in another data.table (maybe: how to take a by= argument into another filter??)
我有一个数据 table,其价格如下所示:
library("data.table")
Data <- data.table(id = c(1,2),
value = c(250, 450))
我有另一个数据 table,其价格分位数分布如下:
lookupdata <- data.table(decile = seq(0.1,1, by = 0.1),
value_lookup = seq(100,1000, by = 100))
我想在第一个 data.table 中添加一列,告诉我每个 ID 恰好在哪个价格十分位数中。我设法编写了一个通过 id 执行此操作的循环:
for(i in Data$id){
Data[id == i, decile := min(lookupdata[Data[id == i,value] <= value_lookup, decile])]
print(i)
}
但是由于我的实际数据有 2300 万个观察值,所以这个循环需要很长时间。我正在寻找针对此问题的有效 data.table
解决方案。所有需要发生的事情都是这样的:在 lookupdata 中查找您的值,当您找到它时,获取关联的十分位数并将其分配给您的 id。
这是我的尝试(请忽略,我只是在寻找解决方案):
Data[, wrong_decile := min(lookupdata[value_lookup >= Data[,value], decile]), by = id][]
这里的问题是内部 Data[, value]
不知道哪个 ID 到 return 所以我只是在这里取全局最小值。我只是无法在没有通过 ID 循环的情况下将其转换为 by=id
格式,因为我不知道如何在过滤器中的另一个 data.table 中使用此 by=id
参数。这可能是我的实际问题,但感觉这应该比我的尝试简单得多。
我认为您正在寻找滚动连接
Data[, decile := lookupdata[Data, decile, on = .(value_lookup = value), roll = "nearest"]][]
# id value decile
# 1: 1 250 0.2
# 2: 2 450 0.4
我有一个数据 table,其价格如下所示:
library("data.table")
Data <- data.table(id = c(1,2),
value = c(250, 450))
我有另一个数据 table,其价格分位数分布如下:
lookupdata <- data.table(decile = seq(0.1,1, by = 0.1),
value_lookup = seq(100,1000, by = 100))
我想在第一个 data.table 中添加一列,告诉我每个 ID 恰好在哪个价格十分位数中。我设法编写了一个通过 id 执行此操作的循环:
for(i in Data$id){
Data[id == i, decile := min(lookupdata[Data[id == i,value] <= value_lookup, decile])]
print(i)
}
但是由于我的实际数据有 2300 万个观察值,所以这个循环需要很长时间。我正在寻找针对此问题的有效 data.table
解决方案。所有需要发生的事情都是这样的:在 lookupdata 中查找您的值,当您找到它时,获取关联的十分位数并将其分配给您的 id。
这是我的尝试(请忽略,我只是在寻找解决方案):
Data[, wrong_decile := min(lookupdata[value_lookup >= Data[,value], decile]), by = id][]
这里的问题是内部 Data[, value]
不知道哪个 ID 到 return 所以我只是在这里取全局最小值。我只是无法在没有通过 ID 循环的情况下将其转换为 by=id
格式,因为我不知道如何在过滤器中的另一个 data.table 中使用此 by=id
参数。这可能是我的实际问题,但感觉这应该比我的尝试简单得多。
我认为您正在寻找滚动连接
Data[, decile := lookupdata[Data, decile, on = .(value_lookup = value), roll = "nearest"]][]
# id value decile
# 1: 1 250 0.2
# 2: 2 450 0.4