使用从R中的.xlsx import创建的data.table时出现Math.factor(j)错误

时间:2013-04-19 21:02:40

标签: r data.table xlsx

我使用基础data.table中的信息从其他data.tables中提取数据,如下例所示:

test <- function() {
    library(data.table)

    test.dt <-     data.table(id=c("abc","xyz","ijk"),type=c("1","1","0"),line.position=1:3)
    counts.dt <- data.table(
            abc=c(10,NA,NA,NA),xyz=c(20,30,NA,NA),ijk=c(10,10,10,10),X2abc=NA,X3abc=1:4)

    print(test.dt)
    print(counts.dt)
    test.dt[,count:=sum(!is.na(counts.dt[[id]])),by=id]
    test.dt[,count.value:=counts.dt[line.position,id,with=FALSE],by=id]
    print(test.dt)
}

这样可以正常工作,并返回预期的结果:从test.dt中的一行拉取使用(line.position,id)的列来获取计数值(line.position,id)。

但是,我不能用一个从工作表中提取数据的更复杂的例子重复这一点。我得到错误:Math.factor(j)中的错误:abs对因素没有意义。在最后一个print语句之前抛出此错误。

test2 <- function(
    file.directory="C:/Users/csnyder/Desktop/BootMethod/",
    file.name="test.xlsx",  
    resample.number=3
    )

{
    require("PBSmapping")
    require("xlsx")
    library(data.table)

    #Load input sheets
    file.path<-sprintf("%s%s",file.directory,file.name)
    excel.data<-read.xlsx(file.path,sheetIndex=1,header=TRUE,stringsAsFactors=TRUE)
    data.DT<-data.table(excel.data)
    excel.data<-read.xlsx(file.path,sheetIndex=2,header=TRUE,stringsAsFactors=TRUE)
    base.DT<-data.table(excel.data)
    excel.data<-read.xlsx(file.path,sheetIndex=3,header=TRUE,stringsAsFactors=TRUE)
    related.DT<-data.table(excel.data)
    excel.data<-NULL

    #add max rows to each ID type. with=TRUE, colnames used as variables.
    #get.text<-function(x){return(as.character(x))}
    base.DT<-base.DT[,Max.Sample:= sum(!is.na(data.DT[[ID]]),na.rm=TRUE),by=ID]

    base.length<-nrow(base.DT)
    base.DT[,Sub.Number:=1:base.length]
    base.DT[,Resample:=1]
    resample.base.DT<-base.DT

    #Add line numbers to data tables.
    data.DT[,Line:=1:nrow(data.DT)]
    related.DT[,Line:=1:nrow(related.DT)]

    #resample number added to base DT, then will make a for loop by resample numbers             and loop it.
    for(counter in 1:resample.number){
        base.DT<-rbindlist(list(base.DT,resample.base.DT[,Resample:=counter]))
    }
    #remove loop initiator
    base.DT<-base.DT[-(1:base.length)]
    #number rows
    base.DT[,Row.Number:=Resample*base.length+Sub.Number-base.length]

    #pick line to sample
    pick.row<-function(x){return(runif(1,1,x))}
    base.DT[,"Line":=runif(1,1,Max.Sample),with=FALSE]
    base.DT[,"Line":=round(runif(1,1,Max.Sample),digits=0),by=Row.Number]

    #Pull cell from data.DT (and related.DT) that has position corresponding to the         matching Row.Number and ID in base.DT
    base.DT[,From.Data:=data.DT[Line,ID,with=FALSE],by=ID]
    print(base.DT)
}

现在,我的excel工作簿中的工作表导入了以下内容(至少对我来说):

Sheet 1中:

data.DT<-data.table(item1=c("AAAA","2XXX",780,684,614,39),item2=c("AAAA","XXX",10,314,NA,NA))

Sheet 2中:

base.DT<-data.table(ID=c("item1","item2"),Level=c("X2XXX","XXX"),Type=c("AAAA","AAAA"),P=c(1000,1000    ),Cat=c("AAAA","AAAA"),Day=c(NA,1))

Sheet3:

related.DT<-data.table(item1=c("AAAA","2XXX",1,1,1,NA),item2=c("AAAA","XXX",1,1,NA,NA))

在我当前的位置,我无法上传工作簿。用上面的直接调用替换excel导入似乎可以解决问题。如果没有可重复的问题,我不得不问:有没有人遇到过这个问题或者想知道如何解决这个问题?或者也许我会以一种错综复杂的方式解决这个问题 - 同样欢迎解决方案!如果需要一个excel工作簿来完全理解我的问题,请告诉我,我会尽力上传一个。

1 个答案:

答案 0 :(得分:6)

这是一个人得到错误:

abs(as.factor(5))
# Error in Math.factor(as.factor(5)) : abs not meaningful for factors

由于stringsAsFactors = TRUEread因为sapply(dt, class) 而导致因素,并且因为您认为其中一列中的一个或多个元素都是数字,实际上不是数字,而是串。通过运行

检查哪些列是因子
5

从那里拿走。


从Arun编辑:您应该注意,在将factoras.character转换为数字时,您应首先使用as.numeric将其转换为字符,然后转换为数字或使用as.integerx <- factor(5) # correct conversion as.numeric(as.character(x)) # [1] 5 # incorrect conversion if you want the number coerced to numeric type as.numeric(x) # gets the levels of factor numeric instead # [1] 1 的整数:

{{1}}