【发布时间】:2016-10-24 03:50:05
【问题描述】:
我有气候数据,我正在尝试用NA 替换异常值。
我没有使用 boxplot(x)$out 是因为我有一个值范围来考虑计算异常值。
temp_range <- c(-15, 45)
wind_range <- c(0, 15)
humidity_range <- c(0, 100)
我的数据框是这样的
(我根据范围突出显示了应该用 NA 替换的值。)
所以temp1和temp2异常值必须根据temp_range替换为NA,wind的异常值应根据wind_range替换为NA,最后humidity的异常值必须根据humidity_range替换为NA。
这是我得到的:
df <- read.csv2("http://pastebin.com/raw/vwqBu2M5", stringsAsFactors = FALSE)
df[,2:5] = apply(df[,2:5], 2, function(x) as.numeric(x))
#Ranges
temp_range <- c(-15, 45)
wind_range <- c(0, 15)
humidity_range <- c(0, 100)
#Function to detect outlier
in_interval <- function(x, interval){
stopifnot(length(interval) == 2L)
interval[1] <= x & x <= interval[2]
}
#Replace outliers according to temp_range
cols <- c('temp1', 'temp2')
df[, cols] <- lapply(df[, cols], function(x) {
x[in_interval(x, temp_range)==FALSE] <- NA
x
})
我正在为每个范围做最后一部分代码(替换)。有没有办法简化它,这样我就可以避免很多重复?
最后一件事,假设 cols <- c('wind') 这会向我发出警告,并将整个 wind 列替换为常量。
Warning message:
In `[<-.data.frame`(`*tmp*`, , cols, value = list(23.88, 23.93, :
provided 10 variables to replace 1 variables
有什么建议吗?
【问题讨论】:
标签: r replace range lapply outliers