2014-03-01 155 views
2

我在R中有一個data.table,我想創建一個新的列,查找相應年份/月份的每個價格的時間間隔。R data.table findInterval()不同的時間間隔

重複的例子:

set.seed(100) 
DT <- data.table(year=2000:2009, month=1:10, price=runif(5*26^2)*100) 
intervals <- list(year=2000:2009, month=1:10, interval = sort(round(runif(9)*100))) 
intervals <- replicate(10, (sample(10:100,100, replace=T))) 
intervals <- t(apply(intervals, 1, sort)) 
intervals.dt <- data.table(intervals) 
intervals.dt[, c("year", "month") := list(rep(2000:2009, each=10), 1:10)] 
setkey(intervals.dt, year, month) 
setkey(DT, year, month) 

我剛纔想:

  • 合併DTintervals.dt data.tables按月/年,
  • 創建一個新的intervalsstring列由所有的V *列到 一列字符串,(不是很優雅,我承認),最後
  • 它substringing爲載體,所以我可以在findInterval()使用它,但該解決方案並不爲每個行工作

所以,後(!):

DT <- merge(DT, intervals.dt) 
DT <- DT[, intervalsstring := paste(V1, V2, V3, V4, V5, V6, V7, V8, V9, V10)] 
DT <- DT[, c("V1", "V2", "V3", "V4", "V5", "V6", "V7", "V8", "V9", "V10") := NULL] 
DT[, interval := findInterval(price, strsplit(intervalsstring, " ")[[1]])] 

我得到

> DT 
     year month  price    intervalsstring interval 
    1: 2000  1 30.776611 12 21 36 46 48 51 63 72 91 95  2 
    2: 2000  1 62.499648 12 21 36 46 48 51 63 72 91 95  6 
    3: 2000  1 53.581115 12 21 36 46 48 51 63 72 91 95  6 
    4: 2000  1 48.830599 12 21 36 46 48 51 63 72 91 95  5 
    5: 2000  1 33.066053 12 21 36 46 48 51 63 72 91 95  2 
---                
3376: 2009 10 33.635924 12 40 45 48 50 65 75 90 96 97  2 
3377: 2009 10 38.993769 12 40 45 48 50 65 75 90 96 97  3 
3378: 2009 10 75.065820 12 40 45 48 50 65 75 90 96 97  8 
3379: 2009 10 6.277403 12 40 45 48 50 65 75 90 96 97  0 
3380: 2009 10 64.189162 12 40 45 48 50 65 75 90 96 97  7 

這是正確的第一行,但而不是爲最後(或其他)行。 例如,對於第3380行,價格〜64.19應該在第5個區間而不是第7個區間。我想我的錯誤是,通過我的最後一個命令,找到間隔只依賴intervalsstring的第一行。

謝謝!

回答

3

你必須給我們的說法by = year的功能適用於所有的子集:

DT[, interval := findInterval(price, intervals[as.character(year), ]), by = year] 

     year  price interval 
    1: 2000 30.776611  4 
    2: 2001 25.767250  1 
    3: 2002 55.232243  4 
    4: 2003 5.638315  0 
    5: 2004 46.854928  2 
    ---       
3376: 2005 97.497761  10 
3377: 2006 50.141227  5 
3378: 2007 50.186270  7 
3379: 2008 99.229338  10 
3380: 2009 64.189162  8 

更新(基於編輯的問題):

DT[ , interval := findInterval(price, 
           unlist(intervals.dt[J(year[1], month[1]), 
                1:10, with = FALSE])), 
    by = c("year", "month")] 
     year month  price V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 interval 
    1: 2000  1 30.776611 12 21 36 46 48 51 63 72 91 95  2 
    2: 2000  1 62.499648 12 21 36 46 48 51 63 72 91 95  6 
    3: 2000  1 53.581115 12 21 36 46 48 51 63 72 91 95  6 
    4: 2000  1 48.830599 12 21 36 46 48 51 63 72 91 95  5 
    5: 2000  1 33.066053 12 21 36 46 48 51 63 72 91 95  2 
    ---                
3376: 2009 10 33.635924 12 40 45 48 50 65 75 90 96 97  2 
3377: 2009 10 38.993769 12 40 45 48 50 65 75 90 96 97  3 
3378: 2009 10 75.065820 12 40 45 48 50 65 75 90 96 97  8 
3379: 2009 10 6.277403 12 40 45 48 50 65 75 90 96 97  0 
3380: 2009 10 64.189162 12 40 45 48 50 65 75 90 96 97  7 
+0

非常感謝斯文!...你能幫我延期嗎?假設我也有幾個月......那麼我該怎麼做? – pidosaurus

+1

@ user2383408你有兩個月和幾年的間隔矩陣嗎?請澄清。 –

+0

感謝您的快速響應,我已經編輯(我希望)我的問題。 – pidosaurus