如何将函数“by”的布尔输出与输入向量匹配

时间:2016-09-23 18:07:44

标签: r

我试图将超出上/下分位数+/- 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的任何建议吗?

感谢。

1 个答案:

答案 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作为确定分割的因素。