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

错误data.table/tibble在myfunc中具有分组setp,并且myfunc用于分组的主DT[,myfunc(v1,v2),mygruop]

  •  0
  • LucasMation  · 技术社区  · 5 年前

    reducemix_q_text <- function(charvar,reducevar){
      d <- data.table(charvar,reducevar)
      t <- substitute(reducevar)
      d2 <- d[,.(gs=paste0(reducevar,collapse=',')),charvar]
      d2[,out:= paste0(t,'(',gs,'): ',charvar)]
      d2$out %>% paste0(collapse ='; ') %>% return
    }
    
    #reprex tests: OK
    t2 <- c('a','a','b')
    q2 <- 0:2
    reducemix_q_text(t2,q2)
    [1] "q2(0,1): a; q2(2): b"
    
    dt <- data.table(t=c(t2,t2), mygroup=c('w','w','s','s'))
    dt[,.(tex=reducemix_q_text(t2,q2)) , by=mygroup]
       mygroup                  tex
    1:       w q2(0,1): a; q2(2): b
    2:       s q2(0,1): a; q2(2): b
    

    根据最后一行,即使按分组使用,该函数也可以工作。然而,当我试图在实际数据上使用完全相同的syintax时,我得到了错误:

    dics[,.(tex=reducemix_q_text(desc,q)) , by=.(a,b,tab,varname,type)]
     Error in `[.data.table`(d, , .(gs = paste0(reducevar, collapse = ",")),  : 
      column or expression 1 of 'by' or 'keyby' is type closure. Do not quote column names. Usage: DT[,sum(colC),by=list(colA,month(colB))] 
    

    我还使用仅dplyr函数重新实现了该函数,但在我自己的master data.table中按组应用时,出现了另一个错误。同样,它通过了测试,但在实际数据上失败:

    reducemix_q_text2 <- function(charvar,reducevar){
      d <- tibble(charvar,reducevar)
      t <- substitute(reducevar)
      d2 <- d %>% group_by(charvar) %>% mutate(gs=paste0(reducevar,collapse=','))
      d2 %>% 
        mutate(out=paste0(t,'(',gs,'): ',charvar)) %>% .$out %>% paste0(collapse ='; ') %>% return
    }
    reducemix_q_text2(t2,q2)
    dt[,.(tex=reducemix_q_text(t2,q2)) , by=mygroup]
    dics[,.(tex=reducemix_q_text2(desc,q)) , by=.(a,b,tab,varname,type)]
     Error: All columns in a tibble must be vectors.
    x Column `charvar` is a function.
    Run `rlang::last_error()` to see where the error occurred. 
    
    0 回复  |  直到 5 年前