在林业中,由于处理错误,手持式测量设备经常会产生十进制错误。如果在数据输入过程中未对其进行纠正,则会导致明显的错误,例如从(高度):24 cm,250cm,26 cm处生长的树。
我的想法是编写一个过滤函数,该函数将高度转换为科学计数法,忽略NA,并且该值在上一个和后续值的范围之内;如果不是,则用适合的指数10代替其他指数(即为了安全起见,中位数==模式)。即2.4e + 1, 2.5e + 2 ,2.6e + 1-> 2.4e + 1, 2.5e + 1 ,2.6e + 1。
我很快意识到普通的if / else函数没有被向量化,因此响应不佳,这就是为什么我使用Vectorize()而不是编写深层嵌套的ifelse的原因。
这是到目前为止我得到的:
我采用一个测试向量,将其转换为科学计数法,分割速记值并创建超前和滞后变量。复制的函数可以找到模式。
由于科学计数法是一个字符,因此我在运行语句并检查它是否在范围内之前将其转换为数字。如果没有,我用模式指数替换指数。
但是,当我运行该函数时,我仍然遇到很多错误,最显着的是我的Vectorscientific [i,“ leader]或类似的维数不正确。我在做什么错了?
Testvector
Vector <- c(2e+2,2.1e+2,2.2e+2,2.3e+4,2.4e+2)
我的预期输出是:c(2e + 2,2.1e + 2,2.2e + 2, 2.3e + 2 ,2.4e + 2)
创建幅度过滤器
magnitudefilter <- function(Vector){
Vectorscientific <- data.frame(Vectorscientific=formatC(Vector,format = "e"))
Vectorscientific$leader <- dplyr::lead(Vectorscientific$Vectorscientific,1)
Vectorscientific$lagger <- dplyr::lag(Vectorscientific$Vectorscientific,1)
Vectorscientific$shorthandvalue <- gsub("e.*","",Vectorscientific$Vectorscientific)
medianexponent <- median(as.numeric(gsub("^.*e",Vectorscientific$Vectorscientific)))
getmode <- function(v) {
uniqv <- unique(v)
uniqv[which.max(tabulate(match(v,uniqv)))]
}
modeexponent <- getmode(as.numeric(gsub("^.*e",Vectorscientific$Vectorscientific)))
Vectorscientific$Vectorscientific <- as.numeric(as.character(Vectorscientific$Vectorscientific))
##Create sorting chain
#if lead NA
sortingchain <- function(Vectorscientific){
if(is.na(Vectorscientific[i,"leader"])){
Vectorscientific[i,"Vectorscientific"] <- Vectorscientific[i,"Vectorscientific"]
}
#if lag NA
else if(is.na(Vectorscientific[i,"lagger"])){
Vectorscientific[i,"Vectorscientific"]
}
# if in range
else if(Vectorscientific[i,"Vectorscientific"] >= Vectorscientific[i,"lagger"] &
Vectorscientific[i,"Vectorscientific"] <= Vectorscientific[i,"leader"]){
Vectorscientific[i,"Vectorscientific"]
}
#if replace exponent
else {
Vectorscientific[i,"Vectorscientific"] <- paste0(Vectorscientific[i,"shorthandvalue"],"e+",medianexponent)
}
}
#Vectorize sorting chain (if/else not vectorised in R)
vectorizedsort <- Vectorize(sortingchain)
if(identical(modeexponent,medianexponent)){
for(i in Vectorscientific){
vectorizedsort(Vectorscientific[i,])
}
}
return(Vectorscientific$Vectorscientific)
}
magnitudefilter(Vector)