次の例のように、ベース 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 ワークブックが必要な場合は、お知らせください。アップロードできるよう最善を尽くします。