0

次の例のように、ベース 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) を使用して counts(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ワークブックのシートは、(少なくとも私にとっては)次のようにインポートされます。

シート 1:

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

シート 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))

シート 3:

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

現在の場所では、ワークブックをアップロードできません。Excel のインポートを上記の直接呼び出しに置き換えると、問題が解決するようです。再現可能な質問がないというリスクがあるので、質問する必要があります。この問題に遭遇した人や、解決方法を知っている人はいますか? あるいは、複雑な方法でこれを行っているのかもしれません。回避策も同様に歓迎されます。私の質問を完全に理解するために Excel ワークブックが必要な場合は、お知らせください。アップロードできるよう最善を尽くします。

4

1 に答える 1