查找 R 中所有特定子集的异常值?

Finding outliers for all specific subsets in R?

我的数据中有几个条件和几种测量类型。
我希望 R 分别给出每对条件和测量类型的离群值。
因此,例如,假设我有几个参与者的 3 个条件 (1-3) 和 3 种类型的度量 (A-C),每行都有一个值 x。我想要 condition1&measureA、condition2&measureB 等的值 x 的离群值。
(measure 和 condition 都是非数值的)

我试过创建循环

for(d in unique(data$measure)){
  for(c in unique(data$condition)){
    data %>%
      filter(measure == d, condition ==c) %>%
      o <- outlier(data$value) %>%
      print(o)
  }
}

这个想法是 R 将 运行 通过每个条件并在循环中进行测量,并且每次都挑选出与这些条件匹配的值并计算异常值。 当我 运行 整个代码时,我收到此错误消息

Error in print.default(., o) : invalid printing digits -2147483648
In addition: Warning message:
In print.default(., o) : NAs introduced by coercion to integer range

(如果我 运行 它没有循环,例如通过搜索特定条件的异常值,它也找不到第一行之后的管道函数。)

知道如何正确编码吗?

您已经在使用 dplyr,所以我建议您使用 group_by,因为它(对我来说)是一种更自然的数据处理方式。

此外,这部分语法不正确:

    data %>%
      filter(measure == d, condition ==c) %>%
      o <- outlier(data$value) %>%
      print(o)

为什么?

  1. filter(...) %>% 应该通过管道传输到 接受帧的东西,但是......你正在从 [=17 发送输出=] 到 assignment o <- outlier(...) (然后到 print(o),这实际上意味着 print(., o) 其中 . 是前一个的输出命令。

  2. 此外,由于 o 在第一次运行时尚未定义...您应该会收到有关 object 'o' not found 的错误消息。你不会在循环中的后续传递中得到它,因为它确实存在......但如果是这样那么它就是循环中 previous 迭代的异常值。当然不是你应该使用的。

对该代码的直接更正可能是:

for (...) {
  for (...) {
    o <- data %>%
      filter(measure == d, condition ==c) %>%
      do({ data.frame(outliers = outlier(.$value)) })
    print(o)
  }
}

其中 o 将是具有三列的 data.frame(好吧,tbl_df 小标题):measureconditionoutliers.在这种情况下do的使用是必需的因为大多数non-tidyverse函数忽略group_by分组,所以我们使用do到side-step那个问题。

不过,也许这样可以将两个循环替换为一个命令:

data %>%
  group_by(measure, condition) %>%
  summarize(outliers = outlier(value)) %>%
  ungroup()

我假设您想要的是 measurecondition 的每个唯一组合的所有离群值,并且 outlier(.) 函数 returns 是一个向量(某些长度 >= 1)。如果没有发现异常值,则 measure/condition 对将不包括在内……如果这是一个因素,则使用类似

的东西
data %>%
  group_by(measure, condition) %>%
  summarize(outliers = list(outlier(value))) %>%
  tidyr::unnest(outliers, keep_empty = TRUE) %>%
  ungroup()