我的数据中有几种情况和几种测量类型。
我希望R分别为我提供每对条件和测量类型的异常值。
举例来说,假设我有3个条件(1-3)和3种类型的度量(AC),用于多个参与者,每行都有一个值x。我想获取条件1和量度A,条件2和量度B等的x值的离群值
(量度和条件均非数字)
我尝试创建一个循环
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)
为什么?
本filter(...) %>%
应输送至东西接受的框架,但是...你要发送的输出filter
入分配 o <- outlier(...)
(然后print(o)
,它真正的意思print(., o)
,其中.
是从以前的命令的输出。
此外,由于o
尚未在第一次运行时定义...,您应该会遇到关于的错误object 'o' not found
。您不会在循环的后续遍历中得到它,因为它确实存在...但是,如果是的话,那是循环中前一次迭代的异常值。当然不是您应该使用的。
该代码的直接更正可能是:
for (...) {
for (...) {
o <- data %>%
filter(measure == d, condition ==c) %>%
do({ data.frame(outliers = outlier(.$value)) })
print(o)
}
}
其中o
将一个data.frame
(当然,tbl_df
tibble)与三列:measure
,condition
,和outliers
。使用的do
是需要在这种情况下,因为大多数非tidyverse函数忽略group_by
分组,所以我们要用do
到侧步这个问题。
不过,也许这可以将两个循环替换为一个命令:
data %>%
group_by(measure, condition) %>%
summarize(outliers = outlier(value)) %>%
ungroup()
我假设你想要的是对的每个唯一组合的所有异常值measure
和condition
,并且该outlier(.)
函数返回一个向量(一些长度> = 1)。如果没有发现异常值,则不会包含measure
/condition
对...如果这是一个因素,则使用类似
data %>%
group_by(measure, condition) %>%
summarize(outliers = list(outlier(value))) %>%
tidyr::unnest(outliers, keep_empty = TRUE) %>%
ungroup()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句