假设我们有以下data.table
:
library(data.table)
dt <- data.table(x=c(-0.01, -0.001, 0, 0.01,0.02,0.03,1,3,4,10,20,25), value=c(rep(1,3), rep(2, 3), rep(3, 2), rep(4, 2), rep(5, 2)))
然后,我使用以下内容指定间隔:
library(Hmisc)
dt[, int:=cut2(x, cuts=c(-Inf, 0.01, 1, 4, 20, Inf))]
返回,
x value int
1: -0.010 1 [ -Inf, 0.01)
2: -0.001 1 [ -Inf, 0.01)
3: 0.000 1 [ -Inf, 0.01)
4: 0.010 2 [ 0.01, 1.00)
5: 0.020 2 [ 0.01, 1.00)
6: 0.030 2 [ 0.01, 1.00)
7: 1.000 3 [ 1.00, 4.00)
8: 3.000 3 [ 1.00, 4.00)
9: 4.000 4 [ 4.00,20.00)
10: 10.000 4 [ 4.00,20.00)
11: 20.000 5 [20.00, Inf]
12: 25.000 5 [20.00, Inf]
假设有新的data.table
dtnew <- data.table(x=c(-0.001, 0.4, 0.3, 5, 25))
x
1: -0.001
2: 0.400
3: 0.300
4: 5.000
5: 25.000
我想要的是将值dtnew
与dt
中的间隔匹配,以便我可以获得dt
中的value
>。预期返回为
x value int
1: -0.001 1 [ -Inf, 0.01)
2: 0.400 2 [ 0.01, 1.00)
3: 0.300 2 [ 0.01, 1.00)
4: 5.000 4 [ 4.00,20.00)
5: 25.000 5 [20.00, Inf]
我尝试为 dtnew
分配间隔,以便我可以使用以下命令merge(dtnew, dt, by = 'int')
:
dtnew[, int:=cut2(y, cuts=c(-Inf, 0.01, 1, 4, 20, Inf))]
其间隔与 中使用的相同dt
。但是,第一行的间隔与 dt
不同,如下所示:
1: -0.001 -Inf
2: 0.400 [ 0.01, 1.00)
3: 0.300 [ 0.01, 1.00)
4: 5.000 [ 4.00,20.00)
5: 25.000 [20.00, Inf]
您能给我一些建议吗?
最佳答案
这是一个简单的滚动连接:
dt[dtnew, on="x", roll=Inf]
# x value int
# 1: -0.001 1 [ -Inf, 0.01)
# 2: 0.400 2 [ 0.01, 1.00)
# 3: 0.300 2 [ 0.01, 1.00)
# 4: 5.000 4 [ 4.00,20.00)
# 5: 25.000 5 [20.00, Inf]
对于dtnew
中的每一行,通过查找x
来找到dt
中的匹配行。如果 dtnew
中的特定值不匹配,而是落在 dt
中的两个值之间的间隙中,则结转前一个/前一个值。
例如,对于 dtnew$x = 0.4
,它位于第 6 行 0.03
和第 7 行 1.00
之间。因此前一行 (=6) 将作为匹配行结转。
关于r - 根据指定间隔映射值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39240545/