代码之家  ›  专栏  ›  技术社区  ›  woodvi

在data.table的“j”参数中没有得到相同的结果

  •  2
  • woodvi  · 技术社区  · 5 年前

    我从data.table的“j”参数中调用一个函数,如果我直接调用它,得到的结果将不同。这似乎与 my function called in data.table j not returning expected results

    get.lower.bound <- function (x) {
      rex <-
        regexpr (pattern = "((?<lower>[\\-+\\d*\\.,]*)%\\s*<\\s*)?X(\\s<\\s(?<uppper>[\\-+\\d\\.,]*)%)?",
                 text = x,
                 perl = TRUE)
      lower_bound <-
        substring(
          text = x,
          first = attr(rex, "capture.start")[2],
          last = attr(rex, "capture.start")[2] + attr(rex, "capture.length")[2] -1
        )
      lower_bound
    }
    
    dat <- data.table(
      A = c('1% < X < 2%', '4% < X',      'X < 8%' ),
      B = c('2% < X < 3%', '5% < X < 6%', '8% < X < 9%' ),
      C = c('3% < X < 4%', '6% < X < 7%', 'X < 10%' )
    )
    
    get.lower.bound(dat[1,'A'])                   # this returns 1; as I expect
    get.lower.bound(dat[2,'A'])                   # this returns 4; as I expect
    get.lower.bound(dat[3,'A'])                   # this returns a blank string; as I expect
    dat[i = 1, j = .(lb1 = get.lower.bound(A))]   # this returns a data table of just one cell with 1 in it; as I expect
    dat[i = 1:3, j = A]                           # this returns a character vector with the original strings in it; as I expect
    dat[i = 1:3, j = .(lb1 = c(A))]               # this returns a data table with the original strings in it; as I expect
    dat[i = 1:3, j = .(lb1 = get.lower.bound(A))] # this returns "1% <", "4% <", "X < 8"; but I expect a "1", "4" & ""
    

    为什么最后一句话没有给我我想要的?我需要做什么才能得到我想要的?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Ronak Shah    5 年前

    我想那是因为你的功能 get.lower.bound 没有矢量化。如果按每行对其进行分组,然后传递函数,则它将给出预期的输出。

    library(data.table)
    dat[, j = .(lb1 = get.lower.bound(A)),  by = 1:nrow(dat)]
    
    #   nrow lb1
    #1:    1   1
    #2:    2   4
    #3:    3