簡體   English   中英

findInterval() 在 data.table R 中具有不同的間隔

[英]findInterval() with varying intervals in data.table R

我很久以前就問過這個問題,但還沒有找到答案。 我不知道這在 stackoverflow 中是否合法,但我重新發布了它。

我在 R 中有一個 data.table,我想創建一個新列來查找相應年/月的每個價格的間隔。

可重現的例子:

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表,
  • 創建一個由所有 V* 列組成的新的intervalsstring列到一個列字符串,(我承認不是很優雅),最后
  • 將其子串成一個向量,以便我可以在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 個區間。 我想我的錯誤是通過我的最后一個命令,找到 Intervals 僅依賴於intervalsstring的第一行。

謝謝!

你的主要問題是你沒有為每個組做findInterval 但我也沒有看到制作大型合並data.tablepaste / strsplit業務的意義。 這就是我會做的:

DT[, interval := findInterval(price,
                              intervals.dt[.BY][, V1:V10]),
     by = .(year, month)][]
#      year month     price interval
#   1: 2000     1 30.776611        2
#   2: 2000     1 62.499648        6
#   3: 2000     1 53.581115        6
#   4: 2000     1 48.830599        5
#   5: 2000     1 33.066053        2
#  ---                              
#3376: 2009    10 33.635924        1
#3377: 2009    10 38.993769        1
#3378: 2009    10 75.065820        7
#3379: 2009    10  6.277403        0
#3380: 2009    10 64.189162        5

請注意, intervals.dt[.BY]是一個鍵控子集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM