将传递给用户定义函数的数据表的变量剪切为参数

时间:2015-06-18 13:31:30

标签: r function data.table cut

我在' helpers.R'中有一个用户定义的功能。叫做' percent_map'它接受如下参数:

percent_map <- function(DT,var,statelist, pal,legend.title)

其中

  • DT是一个数据表,
  • var是数据表中存在的变量,需要以5个相等的部分进行切割
  • pal用于获取调色板名称,州列表是美国州列表

结果/编码值作为一个名为百分数的新变量存储在DT中。

我目前正在编写如下功能:

    percent_map <- function(DT,var,statelist, pal, legend.title) {

      # generate vector of fill colors for map
      shades <- RColorBrewer::brewer.pal(5, pal)

      # constrain gradient to percents that occur between variable range
      ##********Error in the below statement*************
      DT[,percents:=as.integer(cut(DT[,var], 5, include.lowest = TRUE))]



      names <- DT[match(map("state", plot=FALSE)$names,as.character(tolower(DT[,statelist]))),statelist]
      colorsmatched<-DT[match(names,as.character(DT[,statelist])),percents]
      fills <- shades[colorsmatched]  

#map plotting function here 
    }

我在传递数据表visabystate时收到以下错误

 percent_map(DT=visabystate,var = 'casesbystate',statelist='employer_state', pal = "Greens",legend.title="No. of cases")
 Hide Traceback

 Rerun with Debug
 Error in cut.default(DT[, var], 5, include.lowest = TRUE) : 
  'x' must be numeric 
8 stop("'x' must be numeric") 
7 cut.default(DT[, var], 5, include.lowest = TRUE) 
6 cut(DT[, var], 5, include.lowest = TRUE) 
5 eval(expr, envir, enclos) 
4 eval(jsub, SDenv, parent.frame()) 
3 `[.data.table`(DT, , `:=`(percents, as.integer(cut(DT[, var], 
    5, include.lowest = TRUE)))) at helpers.R#11
2 DT[, `:=`(percents, as.integer(cut(DT[, var], 5, include.lowest = TRUE)))] at helpers.R#11
1 percent_map(DT = visabystate, var = "casesbystate", statelist = "employer_state", 
    pal = "Greens", legend.title = "No. of cases") 

如何解决这个问题,最终结果是一样的?这是str(visabystate)

Classes ‘data.table’ and 'data.frame':  50 obs. of  4 variables:
 $ employer_state : Factor w/ 50 levels "Alabama","Alaska",..: 23 36 43 46 5 10 30 33 22 6 ...
 $ casesbystate   : int  2359 603 58586 13080 62708 11107 57028 15313 14347 2247 ...
 $ fulltimebystate: int  4657 1184 116310 25319 122853 22005 113501 30554 28568 4429 ...
 $ workersbystate : int  3113 645 120640 21117 125647 14395 119051 15634 35751 2659 ...
 - attr(*, ".internal.selfref")=<externalptr> 

我尝试过的事情:

如果我使用

,表达式将以交互方式工作
visabystate[,percents:=as.integer(cut(visabystate[,casesbystate], 5, include.lowest = TRUE))]

但是,如果在percent_map函数内的cut内使用DT $ var,则它不起作用。它给出了同样的错误。

修改

在剪切语句中添加= FALSE,如下所示

DT[,percents:=as.integer(cut(DT[,var,with=FALSE], 5, include.lowest = TRUE))]

它提供了以下附加信息:

The following objects are masked from DT (pos = 3):

    casesbystate, employer_state, fulltimebystate, workersbystate

The following objects are masked from DT (pos = 4):

    casesbystate, employer_state, fulltimebystate, workersbystate

The following objects are masked from DT (pos = 5):

    casesbystate, employer_state, fulltimebystate, workersbystate

 Show Traceback

 Rerun with Debug
 Error in cut.default(DT[, var, with = FALSE], 5, include.lowest = TRUE) : 
  'x' must be numeric 

提前致谢!

0 个答案:

没有答案
相关问题