2016-08-31 13 views
2

Lassen Sie uns sagen, dass wir die folgende data.table haben:Map Wert basierend auf bestimmten Intervallen

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))) 

Dann habe ich Intervalle angeben mit dem folgenden:

library(Hmisc) 
dt[, int:=cut2(x, cuts=c(-Inf, 0.01, 1, 4, 20, Inf))] 

Rückkehr

  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] 

Unter der Annahme, Es gibt neue 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 

Was ich will, ist Wert dtnew Intervalle in dt anzupassen, so dass ich value in dt zu erhalten. Die erwartete Rendite würde

sein
 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] 

Ich habe versucht, Intervalle so zu dtnew zuweisen, dass ich kann merge(dtnew, dt, by = 'int') mit dem folgenden:

dtnew[, int:=cut2(y, cuts=c(-Inf, 0.01, 1, 4, 20, Inf))] die Intervalle sind die gleichen wie in dt verwendet. Allerdings ist das Intervall in der 1. Reihe unterscheidet sich von dt wie folgt:

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] 

Könnten Sie mir bitte Anregungen geben?

Antwort

4

Dies ist ein einfaches Roll beitreten:

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] 

Für jede Zeile in dtnew werden die passenden Zeilen in dt gefunden, indem Sie auf x aufzublicken. Wenn ein bestimmter Wert von dtnew keine Übereinstimmung hat, sondern eher in eine Lücke fällt, d. H. Zwischen zwei Werten in dt, dann übertrage den letzten/vorherigen Wert vorwärts. B. für dtnew$x = 0.4, fällt es zwischen Reihe 6 0.03 und Reihe 7 1.00. Und deshalb wird die vorherige Zeile (= 6) als passende Zeile übernommen.

Verwandte Themen