我试图将超出上/下分位数+/- 3 * IQR的数据点设置为NA。我面临的挑战是如何通过数据组来实现这一目标。
作为示例,下面的数据集具有拆分列和值列。对于每个分割,我需要计算值列的上下分位数和IQR,然后将值列中满足上述条件的数据点设置为NA。
x <- structure(list(Split = c(1L, 1L, 3L, 2L, 2L, 2L, 2L, 1L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 3L, 1L, 3L, 2L, 3L), Value = c(0.9, 0.9, 3.5, 2.2, 2.2, 2.2, 2.2, 0.9, 3.5, 3.5, 3.5, 1.1, 3.5, 0.9, 1.9, 3.4, 0.9, 3.5, 2.2, 3.5)), .Names = c("Split", "Value"), class = "data.frame", row.names = c(NA, -20L))
我使用“by”函数来识别需要设置为NA的值:
out <- by(
x$Value,
x$Split,
function(y)
y < (quantile(y, probs=c(.25, .75), na.rm = T)[1] - 3*IQR(y, na.rm = T)) |
y > (quantile(y, probs=c(.25, .75), na.rm = T)[2] + 3*IQR(y, na.rm = T)))
我使用“unlist”输出将数据点设置为NA:
x$Value[unlist(out)] <- NA
这不起作用。 Reason是“by”输出和x $ Value列之间的不同排序。
有关如何匹配两个输出并将相应值设置为NA的任何建议吗?
感谢。
答案 0 :(得分:1)
您可以使用unsplit
代替unlist
来反转by
的分割:
x$Value[unsplit(out, x$Split)] <- NA
## Split Value
##1 1 0.9
##2 1 0.9
##3 3 3.5
##4 2 2.2
##5 2 2.2
##6 2 2.2
##7 2 2.2
##8 1 0.9
##9 3 3.5
##10 3 3.5
##11 3 3.5
##12 3 NA
##13 3 3.5
##14 1 0.9
##15 1 NA
##16 3 NA
##17 1 0.9
##18 3 3.5
##19 2 2.2
##20 3 3.5
再次,使用x$Split
作为确定分割的因素。