我在' helpers.R'中有一个用户定义的功能。叫做' percent_map'它接受如下参数:
percent_map <- function(DT,var,statelist, pal,legend.title)
其中
结果/编码值作为一个名为百分数的新变量存储在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
提前致谢!