数据清除功能:用中位数功率代替十的幂

在林业中,由于处理错误,手持式测量设备经常会产生十进制错误。如果在数据输入过程中未对其进行纠正,则会导致明显的错误,例如从(高度):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)

hualushui1129 回答:数据清除功能:用中位数功率代替十的幂

我可以建议其他方法吗?

Vector <- c(2e+2,2.1e+2,2.2e+2,2.3e+4,2.4e+2)
plot(Vector)

library(robustbase)
#you could adjust the model,e.g.,to be quadratic if necessary
fit <- lmrob(log(Vector) ~ x,data = data.frame(Vector,x = seq_along(Vector)),setting="KS2014")

#outliers are values with robust weight == 0
#you could use a different threshold,< 0.1
out <- !(fit$rweights)

result <- Vector
result[out] <- result[out] / round(result[out]/median(result[!out]),-2)
#[1] 200 210 220 230 240
,

使用strsplit(),您可以取指数的中值并将其粘贴回去。

v <- c(2e+2,2.4e+2)

s <- strsplit(formatC(v,format="e"),"\\+")

md <- median(as.numeric(mapply(`[`,s,2)))

as.numeric(paste0(mapply(`[`,1),"+",md))
# [1] 200 210 220 230 240
本文链接:https://www.f2er.com/3118822.html

大家都在问