我需要一种方法来替换值为-9999的异常值。在我的数据-9999中意味着缺少值。这只是通常用于此类数据而不是NA
的约定我有一个名为amf的数据框,它是43列。我需要逐列进行,并将每个值替换为99百分位数以下,并将1百分位数替换为-9999。我需要删除一些列,例如年份列。
我尝试过以各种方式使用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
这些论文都没有奏效。有什么建议吗?
答案 0 :(得分:1)
在R中工作时,请使用NA
表示缺失值。任何其他东西都会造成编码问题并成为bug的来源。导出数据时,只应使用不同的缺失值,以便与需要此类不同值的其他软件一起使用。 write.table
(及其变体如write.csv
)有一个na
参数,您可以指定此值。
write.csv(amf_out, "my file", na = "-9999")
答案 1 :(得分:1)
暂且不管你是否应该这样做,这是另一种选择:
threshold <- 1000
as.data.frame(lapply(amf_out, function(x) replace(x, x > threshold, -9999)))
在这里,您逐列,并替换超过您的阈值的值。据推测,您希望所有值都具有相同的阈值。它可以是1000
,也可以是分位数,或其他任何内容。
答案 2 :(得分:0)
要获取输出data.frame,您可以使用以下内容:
amf_out <- apply(amf[,4:43],2, function(x) {x[x > quantile(x, .99) & x < quantile(x, .01)] <- -9999;x})