gpt4 book ai didi

r - findInterval() 在 data.table R 中具有不同的间隔

转载 作者:行者123 更新时间:2023-12-04 23:01:31 26 4
gpt4 key购买 nike

我很久以前就问过这个问题,但还没有找到答案。我不知道这在 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按月/年划分的数据表,
  • 新建intervalsstring由所有 V* 列组成的列
    一列字符串,(我承认不是很优雅),最后是
  • 将其子串化为向量,以便我可以在 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.table ,或 paste/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]是一个键控子集。

    关于r - findInterval() 在 data.table R 中具有不同的间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22671400/

    26 4 0