【问题标题】:Replacing outlier values in R替换 R 中的异常值
【发布时间】:2014-02-07 17:04:33
【问题描述】:

我需要一种将异常值替换为 -9999 的方法。在我的数据中,-9999 表示缺少该值。这只是通常用于此类数据的约定,而不是 NA

我有一个名为 amf 的数据框,它有 43 列。我需要逐列并用 -9999 替换 99 个百分位以上和 1 个百分位以下的每个值。我需要跳过一些列,例如一年中的某一天。

我尝试过以各种方式使用 apply 和 lapply 函数,但我一定是错误地使用了它们。这是我尝试过的

amf_out <- apply(amf[,4:43],2, which(amf[,4:43] > quantile(amf[,4:43, .99)))

amf_out <- lapply(1:length(amf), function(i) amf[which(amf[,i] > quantile(amf[,1],.99))] <- 
-9999)

amf[which(amf[,4:43] > quantile(amf[,4:43], .99))] <- -9999

这些都没有奏效。有什么建议吗?

【问题讨论】:

  • 您这样做的理由是什么?根据您的设置/数据,这可能是非常不道德的。
  • 我同意 rawr。如果您想删除异常值,您至少应该使用适当的异常值测试。但是,您根本不应该这样做。
  • 这是来自气象仪器的数据。有时,仪器可能会发生故障并记录超出可接受范围的值,例如温度为 1000 C。任何明显不可接受的值都需要设置为一个指定缺失值的值。
  • 但是你不应该根据分位数来做这个,而是定义一个气象上可能的温度范围。
  • 去除极值的更好功能是什么?

标签: r replace outliers


【解决方案1】:

当您在 R 中工作时,使用 NA 表示缺失值。其他任何事情都会造成编码难题并成为错误的来源。在导出数据以用于需要此类不同值的其他软件时,您应该只使用不同的缺失值。 write.table(及其变体,如 write.csv)有一个 na 参数,让您可以指定此值。

write.csv(amf_out, "my file", na = "-9999")

【讨论】:

    【解决方案2】:

    不管你是否应该这样做,这里还有另一种选择:

    threshold <- 1000
    as.data.frame(lapply(amf_out, function(x) replace(x, x > threshold, -9999)))
    

    在这里,您逐列替换超过阈值的值。大概您希望所有值都具有相同的阈值。可以是1000,也可以是分位数。

    【讨论】:

      【解决方案3】:

      要得到一个输出的data.frame,你可以使用以下:

      amf_out &lt;- apply(amf[,4:43],2, function(x) {x[x &gt; quantile(x, .99) &amp; x &lt; quantile(x, .01)] &lt;- -9999;x})

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-05
        • 1970-01-01
        • 1970-01-01
        • 2021-08-17
        相关资源
        最近更新 更多