1

我需要一种方法来用值 -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

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

4

3 回答 3

1

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

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

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

于 2014-02-07T18:36:07.930 回答
1

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

write.csv(amf_out, "my file", na = "-9999")
于 2014-02-07T17:17:34.890 回答
0

要获取输出 data.frame,您可以使用以下内容:

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

于 2014-02-07T17:12:33.127 回答