我使用基础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工作簿来完全理解我的问题,请告诉我,我会尽力上传一个。
答案 0 :(得分:6)
这是一个人得到错误:
abs(as.factor(5))
# Error in Math.factor(as.factor(5)) : abs not meaningful for factors
由于stringsAsFactors = TRUE
中read
因为sapply(dt, class)
而导致因素,并且因为您认为其中一列中的一个或多个元素都是数字,实际上不是数字,而是串。通过运行
5
从那里拿走。
从Arun编辑:您应该注意,在将factor
从as.character
转换为数字时,您应首先使用as.numeric
将其转换为字符,然后转换为数字或使用as.integer
或x <- 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}}