首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >寻找R中所有特定子集的离群值?

寻找R中所有特定子集的离群值?
EN

Stack Overflow用户
提问于 2020-09-26 21:13:29
回答 1查看 140关注 0票数 1

我的数据中有几种条件和几种类型的测量。

我想让R分别给出每对条件和测量类型的离群值。

例如,假设我对几个参与者有3个条件(1-3)和3种度量类型( and ),每一行都有一个值x。我想要条件1和测度A,条件2和测度B等的值x的异常值。

(测度和条件都是非数值的)

我试过创建一个循环

代码语言:javascript
复制
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将在一个循环中遍历每个条件和度量,每次都选择匹配这些条件和度量的值,并计算出异常值。当我运行整个代码时,会收到以下错误消息:

代码语言:javascript
复制
Error in print.default(., o) : invalid printing digits -2147483648
In addition: Warning message:
In print.default(., o) : NAs introduced by coercion to integer range

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

知道该如何正确编码吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-26 21:25:47

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

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

代码语言:javascript
复制
    data %>%
      filter(measure == d, condition ==c) %>%
      o <- outlier(data$value) %>%
      print(o)

为什么?

  1. filter(...) %>%应该连接到能接受帧的东西,但是.您正在将来自filter的输出发送到赋值o <- outlier(...) (然后发送到print(o),这实际上意味着print(., o),其中.是前一个命令的输出。

)

  1. 进一步说,由于第一次运行o还没有定义.您应该得到一个关于object 'o' not found的错误。在循环中的后续传递中不会得到它,因为它确实存在.但如果是这样的话,则是循环中上一次迭代中的异常值。当然不是你应该使用的东西。

对该守则的直接更正可能是:

代码语言:javascript
复制
for (...) {
  for (...) {
    o <- data %>%
      filter(measure == d, condition ==c) %>%
      do({ data.frame(outliers = outlier(.$value)) })
    print(o)
  }
}

其中,o将是一个有三列的data.frame (好吧,tbl_df tibble):measureconditionoutliers。在这种情况下,需要使用do,因为大多数非tidyverse函数忽略了group_by分组,因此我们使用do来解决这个问题。

不过,也许是为了将这两个循环替换为一个命令:

代码语言:javascript
复制
data %>%
  group_by(measure, condition) %>%
  summarize(outliers = outlier(value)) %>%
  ungroup()

我假设您想要的是measurecondition的每个唯一组合的所有异常值,并且outlier(.)函数返回一个向量(长度为>= 1)。如果未发现异常值,则不包括measure/condition对.如果这是一个因素,那么使用类似的

代码语言:javascript
复制
data %>%
  group_by(measure, condition) %>%
  summarize(outliers = list(outlier(value))) %>%
  tidyr::unnest(outliers, keep_empty = TRUE) %>%
  ungroup()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64082565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档